- 締切済み
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); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
>次のプログラムを実行したらどう出力されますか。 Borland C++5.6.4 で実行したところ、 1, 0, 7, 10, 3, 7 と出力されました。 >人間の頭で結果を出すための計算方法が分からず、頭を悩ませています。 ソースの一部に括弧を付加してみました。一助になれば・・。 int x = 5; int y = 8; int z = 3; int a, b, c, d, e, f; a = ( y == ( x + z ) ); // = y と x + z が等しい = 1 b = ! x; // not true = false = 0 c = x + y / z; // = 5 + 8 / 3 = 7 d = ( x *= ( z - 1 ) ); // x = 5 * ( 3 - 1 ) = 10 e = --y / --z; // = 7 / 2 = 3 f = y++ % x++; // = 7 % 10 = 7
- jacta
- ベストアンサー率26% (845/3158)
> 単純に計算だけをして、それぞれの変数に格納されている最終的な値だけを知りたい場合はどうなりますか? 未定義の動作なので、コンパイルが完了するかどうか、コンパイルできても起動するかどうか、起動しても知りたい箇所の演算部分に到達するかどうか、到達しても常に同じ結果になるかどうかなど、すべてがどうなるか分かりません。 処理系が特定できるのであれば、実際に試してみるのが一番です。
- jacta
- ベストアンサー率26% (845/3158)
> 書き換えて再度質問をさせていただいています。 まだ未定義の動作になります。 mainの返却値はintでなければなりません。 独自仕様として動作が既定されている処理系もありますが、処理系を限定していないのであれば、未定義の動作としかいえません。
- tyatsumi
- ベストアンサー率58% (30/51)
> 未定義の動作のため、何が起きるかわかりません。 と聞くとやってみたくなる‥。私暇ですね。 ソースをコピペしてコンパイルしてみた。 $ vi test.c # ← コピペしている。 $ make test gcc test.c -o test test.c: In function `main': test.c:14: error: syntax error before '%' token test.c:3: warning: return type of 'main' is not `int' make: *** [test] Error 1 コンパイルエラーが出た。 質問者さんはコンパイルしてみなかったのだろうか‥。 よくわからないけど14行目(f = y+++ % x++;)を コメントアウト(/*f = y+++ % x++;*/)して再挑戦。 $ vi test.c # ← コメントアウトしている。 $ make test gcc test.c -o test test.c: In function `main': test.c:3: warning: return type of 'main' is not `int' コンパイル通った。警告とか無視。いざ実行。 $ ./test 1,0,7,10,3,2013314410 最後の大きな値はコメントアウトした部分の 未初期化のせいなので気にしない。
お礼
回答ありがとうございます。 色々と試してくださり、ありがとうございました。 実は、 f = y+++ % x++; この部分は私の入力ミスです。 正しくは、 f = y++ % x++; です。大変失礼しました。 正しく書き換えて再度質問させていただいております。 そちらもご覧になっていただけると嬉しいです。 私の入力ミスがあったにも関わらず、答えが出力されていますね! ありがとうございます。 質問に記載しているプログラムは、筆記の出題だったのでコンパイルでエラーが出ることに気付きませんでした。。 人間の頭で結果を出すための計算方法が分からず、頭を悩ませています。 考え方もお分かりでしたら、ぜひ教えていただきたいです。
- jacta
- ベストアンサー率26% (845/3158)
未定義の動作のため、何が起きるかわかりません。
お礼
回答ありがとうございます。 未定義の動作、ですか…。 C言語初心者で詳しい問題点が分からなくて申し訳ありません。 ちなみに、 f = y+++ % x++; のところは入力ミスをしてしまいました。 正しくは、 f = y++ % x++; です。 書き換えて再度質問をさせていただいています。 皆様を混乱させてしまうミスをしてしまい、失礼しました。
お礼
再度ありがとうございます。 学校で配られた演算演習のプリントに書かれているプログラムなので、そのような問題点が出てくるとは思ってませんでした。。 単純に計算だけをして、それぞれの変数に格納されている最終的な値だけを知りたい場合はどうなりますか? 基礎的なインクリメントの考え方などが分からなくて困っています。。