• 締切済み

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% (2127/6289)
回答No.7

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

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答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% (2127/6289)
回答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