- ベストアンサー
C言語
/*test1*/ main() { static int data[] = {1,2,3,4,5,6,7,8,9}; int i,ct = 0; i = 2; while(i < 8){ ct += data[i]; i++; } printf("%d",ct); } /*test2*/ main() { int i = 0, j =0, ct = 0; while(i < 5) ct = ct + (++i) + (j++); printf("%d",ct); } 上記のプログラムで、test1は33、test2は25という実行結果になります。私が分からないのは、test1のwhile(i < 8)ではdata[7]まで数え、test2のwhile(i < 5)ではiが5になるまで数える事です。問題集をやっていて疑問に思ったのですが解答だけが載っており説明が載っていなかったので質問しました。理解されてるかたには簡単すぎる質問ですがよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
単項演算子++と--には、「前置」と「後置」という使い方が存在します。 前置とは「++i」のように変数の前につける方法で、式全体を評価する前に変数の値を変化させます。 また、後置とは「i++」のように変数の後ろにつける方法で、式全体を評価した後に変数の値を変化させます。 つまり、 i = 0; a = ++i; printf("a=%d, i=%d\n", a, i); の結果は「a=1, i=1」となり、 i = 0; a = i++; printf("a=%d, i=%d\n", a, i); の結果は「a=0, i=1」となります。 ただし、1つの式の中で、1つの変数の値を2回変更するような記述をしてはいけません。つまり、 a = (i++) * (++i); のような式は、書いてはいけないということです。 なぜなら、このような使い方をした場合の動作はCの仕様では定義されておらず、処理系によって結果が異なる恐れがあるからです。 (処理系に依存したプログラムは移植性に欠け、見つけにくいバグを生み出します。) ですから、複雑な式の中で++などを行う必要がある場合は、確実に意図した通りに実行されるよう式を分解するのが、バグを防ぐ最良の手段です。
その他の回答 (4)
- ponnta
- ベストアンサー率17% (31/179)
ANo3の値がチョッと変なので訂正 ・i<8のチェック時の値 ・ctを求めるときの値 ct i j ct i j 計(ct) 0 0 0 0 1 0 1 1 1 1 1 2 1 4 4 2 2 4 3 2 9 9 3 3 9 4 3 16 16 4 4 16 5 4 25 25 5 5 <―この時のチェックでループが終わる 以上訂正でしたiとjの増えるタイミングの問題です
- ponnta
- ベストアンサー率17% (31/179)
まずtest1ですが iは8までカウントされています。 プログラムの流れとして ・i<8のチェック ・ctの計算 ・iを増やす の繰り返しです iが8になったときは先頭のチェックではじかれるため ctの計算は通らなくなるので実質data[0]~data[7]の 和が作成されます test2の時の3つの変数の変化はctを計算しているときに ct i j 0 0 0 0 1 0 1 2 1 4 3 2 9 4 3 * 16 5 4 iとjの増えるタイミングに注意してください 式中の ++i は式の計算よりもインクリメントが優先されます 逆に j-- は式の計算に使われた後でインクリメントされます。 test1もtest2もiは比較してる数値まで増えているのですが 増えるタイミングによってそのように見えているのです
- yanmaa
- ベストアンサー率45% (207/457)
++i と j++ では計算順序が異なるのでね test2の ct = ct + (++i) + (j++) の場合 ++iを計算してctに足すけど j++はctにjの値を足してからjに値を+1してるのですよ。 だから iの値は1,2,3,4,5と言う値をctに足し jの値は0,1,2,3,4と言う値をctに足しているから25という答えになるのです。 test1は配列の最初の値はdata[0]に入っているからですね 足す値は3,4,5,6,7,8で33という答えです。 最近Cを使っていないの間違ってたらすまんです。
それは一言で言ってしまうと、 「i++」と「++i」の差です。 i++は、その数値を参照してから1加えてるのに 対し、 ++iは、1を加えたものを参照しているということです。 つまり、Test2のプログラムのiの参照の仕方は、 1,2,3,4,5となり、5で抜けるって感じになる ってことです。 どうでしょうか?後参照にしたのURLを見ていただければ 違いは一目瞭然かと.