• ベストアンサー

演算子がわかりません。

最近、Cの勉強を始めたばかりの素人です。以下を実行すると、出力が45になります。iが6になって、jが9になり、掛けるだけなので54になると思うのですが、恥ずかしいことに私の理解力が足りないようです。 お手数ですが、どなたか分かりやすく教えて頂けませんでしょうか。 #include <stdio.h> int main(void) { int i = 5, j = 10, k; k = i++ * --j; printf("%d\n", k); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.4

こんにちは。 以前にも、質問者さんの似たようなご質問にお答えしましたが、 こういうとき(しばらく考えても解らない場合)は、まず、   『実行中の各変数の値がどうなっているかを    実際に、目で見て確認できるような処置を    プログラムに挿入してみて確かめてみる。』 といったような対処が必要だと思います。 今回の場合は、 ========================= #include <stdio.h> int main(void) { int i = 5, j = 10, k; int i2, j2; /* iとjの値の保存用変数 */ printf( "Check-1: i=%d, j=%d\t[before: i++, --j]\n", i, j ); i2 = i++; /* iを別変数i2に保存する → i2はインクリメントされる前のiの値 */ j2 = --j; /* jを別変数j2に保存する → j2はデクリメントされた後のjの値 */ printf( "Check-2: i2=%d, j2=%d\t[ save : i2=i++, j2=--j]\n", i2, j2 ); printf( "Check-3: i=%d, j=%d\t[after : i++, --j]\n", i, j ); /** k = i++ * --j; **/ k = i2 * j2; /* この式は、k = i++ * --j と同義 */ printf( "Check-4: k=%d\t\t[ k = i2 * j2 --> k = %d * %d ]\n", k, i2, j2 ); printf( "%d\n", k ); return 0; } ========================= のように、検証用のprintf文を追加してみました。 上記のプログラムの実行結果は、 ========================= Check-1: i=5, j=10   [before: i++, --j] Check-2: i2=5, j2=9   [ save : i2=i++, j2=--j] Check-3: i=6, j=9    [after : i++, --j] Check-4: k=45      [ k = i2 * j2 --> k = 5 * 9 ] 45 ========================= のようになりました。 これで、少しは、各変数の変化の仕方及び、前置/後置のインクリメント 演算子、デクリメント演算子の役割が理解し易くなるのではないかと思い ます。 以上です。

buta3_2009
質問者

お礼

ご丁寧にありがとうございます。インクリメント・デクリメントがわかりました。

その他の回答 (3)

回答No.3

「i++」は「計算(評価)が終ってから1を足す」のです。 一方「--j」は「計算(評価)する前に1を引く」のです。 なので「k = i++ * --j」は「まず、jから1を引いてjに入れて、iとjを掛け算して、掛け算の答えをkにいれてから、iに1を足してiに入れる」のです。 「まず、jから1を引いてjに入れて、iとjを掛け算して、掛け算の答えをkにいれてから、iに1を足してiに入れる」と言う動作を「i、j、kそれぞれにどんな値が、いつ代入されるか」に注意しながら、追いかけてみましょう。

buta3_2009
質問者

お礼

よく理解できました。ありがとうございます。

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

i++は式の評価後にインクリメントされるので評価時点での値は5 --jは式の評価前にデクリメントされるので評価時点での値は9 なので i++ * --j は45になります。 良く理解して使う分には便利な演算子ですが評価順序の誤りを犯しやすいので、こういう使い方は避けた方が良いです。

buta3_2009
質問者

お礼

なるほど。わかると簡単なのですね。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

http://www9.plala.or.jp/sgwr-t/c/sec03.html 前置演算と後置演算を区別してください。 >k = i++ * --j; この行を実行すると、 i・・・足される前の5 ※i++と++iでは、結果的にiに格納される値は同じですが、計算に使用される(参照された時の)値が異なります。 j・・・引かれた後の9 が使用され、5*9で45となります。

buta3_2009
質問者

お礼

とてもよくわかりました。ありがとうございます。

関連するQ&A