• 締切済み

C言語の演算について

次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。 なお、先ほど記述ミスがあるのにも関わらず投稿してしまいました…。 正しい記述はこちらの質問です。 大変失礼しました。 前の質問は削除可能になり次第、削除いたします。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.8

>できれば途中のトレースも書いていただけると 自分がトレースした結果を書かないのはなぜ? とりあえず、演算子の意味と順位はC言語の基礎です。 以下のHPの最後の優先順位を見てから、 何が分からないのか明確にしてください。 http://www9.plala.or.jp/sgwr-t/c/sec14.html #それとも、演算子の意味ではなくて、 #「代入」や「比較」の日本語の意味が分かりませんか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

>>main関数の型をintにし、 > >void main(int) と入力するっていうことですか? いえ、そうではなく、main関数の「戻り値の型」をintにします。 int main(void)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

> イコールが1つの場合と2つの場合じゃ代入の仕方が変わってくるのでしょうか? イコールが1つ:代入 イコールが2つ:比較(代入ではない)→結果は真か偽

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

x = 5; y = 8; z = 3; a = y == x + z; printf("x = %d y = %d z = %d a = %d\n", x, y, z, a); x = 5; y = 8; z = 3; a = y = x + z; printf("x = %d y = %d z = %d a = %d\n", x, y, z, a);

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

>b = !x; >この演算式って、bはxではない、と表現しているのでしょうか…? 上記に関してはCの文法書の演算子の項目を見て下さい。 最初の方に有ると思います。 >a = y == x + z; >のところなんですが、イコールが1つの場合と2つの場合 >じゃ代入の仕方が変わってくるのでしょうか? # if(x = y) と if(x == y) でどう違うと思いますか? printf("%d\n", y == x); printf("%d\n", (y == x) + z); printf("%d\n", y == (x + z)); printf("%d\n", y != x); printf("%d\n", (y != x) + z); printf("%d\n", y != (x + z)); 違いが判らないのであれば、上記の様に式の一部のみを出力 したり、式をいろいろ変えて試してみる事です。 それと.....元プログラムに printf("x = %d y = %d z = %d\n", x, y, z); を計算式の前後に入れて、値の変化を確認してみて下さい。

em-0909
質問者

お礼

回答ありがとうございます! >それと.....元プログラムに >printf("x = %d y = %d z = %d\n", x, y, z); >を計算式の前後に入れて、値の変化を確認してみて下さい。 なるほど、そんな方法があったのですね。 さっそくやってみました。 ># if(x = y) と if(x == y) でどう違うと思いますか? 今命令の度に値を表示させてみたのですが、 a = y == x + z; この場合はa=1なのに対して、 a = y = x + z; この場合はa=8になってしまいました。 考えれば考えるほど深みにはまってしまいます。 もっと違うとこで大きなミスがあるんですかね。。 素敵なアドバイスがいただけたので、原因を分析して解答を出したいと思います! とても助かりました。

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.3

a~fまで全部、普通は使わないただの意地悪な算数パズルな式なので、 覚えなくていいですよ‥とか言ったら先生に怒られるのだろうか。 演算子には優先度があるのですが、覚えるのが大変です。 無駄でも括弧を付けるとわかりやすくなります。 a = (y == (x + z)); b = (!x); c = (x + (y / z)); d = (x *= (z - 1)); e = ((--y) / (--z)); f = ((y++) % (x++)); 見やすくなった‥。 あとは各演算子の意味を調べれば答えにたどり着けるかと思います。

em-0909
質問者

お礼

とっても分かりやすくなりました! 今地道に計算中です。 何度もつまずきそうになってますが、頑張って答えを出したいと思います。 普段は使わない演算なのですね。 たぶん先生の意図するところは、正にそこだと思うのでどうにかして解決させたいです。 アドバイスありがとうございました!

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

main関数の型がvoidなので、どんな結果を得るか 保証できないと思います。 main関数の型をintにし、 コードの最後の } の直前に return 0; を付けて実行した結果を、 何というコンパイラーをお使いであるかとともにお知らせください。

em-0909
質問者

お礼

回答ありがとうございます。 質問内容通りに実行してみたところ、 1,0,7,10,3,7 -- Press any key to exit (Input "c" to continue) -- と出力されました。 結果は出ましたが、経過が分からなく頭を悩ませています…。 >main関数の型をintにし、 void main(int) と入力するっていうことですか? >コードの最後の } の直前に return 0; を付けて 付けてみました! その結果メッセージ部分に、 エラー E2467 問題.cpp 16: 'main(int)' は値を返せない(関数 main(int) ) *** 1 errors in Compile *** と出力されるのですが…わたしの記述がおかしいんですかね? 私が使っているのは、CPad for Borland C++Compilerというフリーソフトです。 情報が少ないようでしたらご指摘お願いします。 質問内容に不十分な場所が多く、失礼いたしました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

自分でトレースすればいいと思うんだが.... ちなみにあなたはどういう結果になると思いますか? その理由は?

em-0909
質問者

お礼

回答ありがとうございます。 トレースしていたのですが、はじめからつまずいてしまいました…。 a = y == x + z; のところなんですが、イコールが1つの場合と2つの場合じゃ代入の仕方が変わってくるのでしょうか? あと、 b = !x; この演算式って、bはxではない、と表現しているのでしょうか…? 解決できない点が多すぎて、自分で結果を出すことができませんでした。 失礼な質問の仕方をしてしまい、申し訳ありませんでした。。

関連するQ&A

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y+++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • C言語のプログラムについて

    三角形を判定するプログラムを作ったのですが直角三角形ができるはずがないのに直角三角形の判定が出てしまいます。簡単なことなのかもしれませんが自分ではわからなくなってしまったのでご指摘してもらいたいです。 #include<stdio.h> void tri(int x,int y,int z) { if((x*x==y*y+z*z)||(y*y==x*x+z*z)||(z*z==x*x+y*y)) { printf("これは直角三角形です。"); printf("これは三角形です。"); }else if((x+y>=z)||(x+z>=y)||(y+z>=x)) { printf("これは三角形ではありません。"); }else{ printf("これは三角形です。"); } } int main(void) { int e1,e2,e3; printf("3辺を入力してください"); scanf("%f,%f,%f",&e1,&e2,&e3); tri(e1,e2,e3); return(0); }

  • C言語のポインタの考え方について

    ポインタについて理解ができていないのでお聞きしたいのですが 値を交換する関数のプログラミングでこの場合ポインタ で以下にしないといけないと思います。 #include<stdio.h> void swap(int *a int *b){ int c; c=*a; *a=*b; *b=c; } main(){ int x,y; x=123; y=456; swap(&x,&y); printf("x = %d, y = %d\n", x, y); } またポインタを使用せず以下のプログラムではなぜダメのでしょうか。 よろしくお願い致します。 #include<stdio.h> void swap(int a int b){ int c; c=a; a=b; b=c; } main(){ int x,y; x=123; y=456; swap(x,y); printf("x = %d, y = %d\n", x, y); }

  • C++ の new演算子について

    C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント     の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • C言語で連立一次方程式

    C言語で連立一次方程式 /* 連立一次方程式 a*x + b*y = e c*x + d*y = f の解を求めるプログラムを作成したい。 a,b,c,d,e,f をキーボード入力させる ことで、 行列 [a b c d] の逆行列、及び、連立方程式の解( x= , y= )を求めたい。 なお、a b c d の値によっては、逆行列を求めることが 出来ません。その時は、 【解を求めることはできません】 と表示してプログラムを終了するようにして下さい。 (注) [a,b,c,d,e,f]を 2次元配列 ma[2][3]とする. [逆行列[a,b,c,d]と解x,y]を 2次元配列 mb[2][3]とする. ma[][] の値をmain関数内でキーボード入力する mb[][] の値は,mat_keisan関数内で計算 mb[][] の値をmain関数内で表示 関数 mat_keisan の戻り値として,「解」が求まる方程式か どうかを知らせる「int 型のフラグ(旗)」として用いるとよい. */ #include<stdio.h> int mat_keisan(int ma , int mb); int main(void) { int inverse; double ma[2][3]; double mb[2][3]={0}; printf("連立一次方程式の計算\n"); printf("a * x + b * y= e\n"); printf("c * x + d * y= f\n"); printf("Input a :"); scanf("%lf",&ma[1][1]); printf("Input b :"); scanf("%lf",&ma[1][2]); printf("Input c :"); scanf("%lf",&ma[1][3]); printf("Input d :"); scanf("%lf",&ma[2][1]); printf("Input e :"); scanf("%lf",&ma[2][2]); printf("Input f :"); scanf("%lf",&ma[2][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[1][1],ma[1][2],ma[1][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[2][1],ma[2][2],ma[2][3]); inverse=mat_keisan(ma,mb); if(inverse==1) printf("計算できません\n"); else{ printf("逆行列\n"); printf("%4.2f %4.2f\n", mb[1][1],mb[1][2]); printf("%4.2f %4.2f\n", mb[2][1],mb[2][2]); printf("解\n"); printf("x=%4.2f\n",mb[1][3]); printf("y=%4.2f\n",mb[3][3]); } return (0); } /* 配列の足し算 */ int mat_keisan(int ma ,int mb ) { int x,y,z;// 1/ma[1][1]*mb[2][2]-ma[1][2]*mb[2][2]; //逆行列と解を求めるプログラムを作成する。 //そしてその値をmb[][] に入力する。 return(#######); } 関数内が手も足もでません; 他のサイトを調べてみたのですが逆行列を求めるプログラムがよくわかりません; >int mat_keisan(int ma ,int mb ) は、あってないかもです; それとinverseの意味がわかりません; ヒントや、解説を よろしくお願いします;。

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • 助けてください(C言語)

    初心者です。 足し算と引き算をするプログラムを作りましたが コンパイルまではとおっていますが、実行し、 5+3= とうつと、804399520 804399524 804399528[1] Done とでます。 どこがいけないのか?ご教授いただければと思います。 回答でなくても良いのでヒントを下さい。 #include<stdio.h> /* 演算を実行し,値を返す関数を設ける */ int tashizan(int keyInpInt1,int keyInpInt2); int hikizan(int keyInpInt1,int keyInpInt2); tashizan(int keyInpInt1,int keyInpInt2) /* 加算 */{ return(keyInpInt1 + keyInpInt2); } hikizan(int keyInpInt1,int keyInpInt2) /* 減算 */{ return(keyInpInt1 - keyInpInt2); } void main(void) { /*入力用と,出力用の変数を定義*/ int keyInpInt1,keyInpInt2,x; char F,tougou; /* 計算式の入力受付 */ printf("式-->"); scanf("%d %c %d %c",&keyInpInt1,&F,&keyInpInt2,&tougou); switch(F){ case '+' :x = tashizan(keyInpInt1,keyInpInt2); break; case '-' :x = hikizan(keyInpInt1,keyInpInt2); break; } /* 演算結果を出力 */ printf("%d %c %d %c %d",&keyInpInt1,&F,&keyInpInt2,&tougou,&x); }

  • 参照による呼び出し

    参照による呼び出しで3つの整数を大きい順に並び替えるという プログラムで、 #include<stdio.h> void change(int *x,int *y,int *z);/       main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("入力データ:a=%d,b=%d,c=%d\n",a,b,c); change(&a,&b,&c); printf("入れ替え後:a=%d,b=%d,c=%d\n",a,b,c); return(0); } void change(int *x,int *y,int *z){ if(*x>*y){ *a=*x; *c=*y; } else{ *a=*y; *c=*x; } if(*z>*a){ *b=*a; *a=*z; } else if(*z>*c){ *b=*z; } else{ *b=*c; *c=*z; } } のように作ったのですが、zの値が一度も使われていないとエラーが 出てしまいます。どこをどう直せばいいか教えてください。 お願いします。

専門家に質問してみよう