- ベストアンサー
後置か、それとも前置インクリメントか
class Sum{ public static void main(String[] args){ int s = 0 , i = 1; do{ i = ++i; s = s+1; }while(i < 10); System.out.println("1から" + i + "までの和は" + s); } } 上記のプログラムについて質問なんですが、 5行目、i = ++i; の部分を i = i++; と、 後置インクリメントにしたところ、実行時何も表示されませんでした。 前置・後置インクリメントの違いも調べましたが、なぜこうなるのかわかりません。どなたか教えていただけないでしょうか? それとも、こういうのは「なぜ?」と考えるだけムダなのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
i = i++; で、iが1の場合を考えてみると、 1 = 1++; となります。 左辺にまず1が代入された後、右辺が2になりますので、 左辺は1のままです。 よって永続ループとなって、 System.out.println("1から" + i + "までの和は" + s); の行まで処理が進んでいないために表示されないんだと思います。
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1416)
ア.i = ++1; iをインクリメントした値を作成し、iに代入する。 内部動作 (1) work ← i (2) work ← work + 1 (3) i ← work ※work はマシン内の作業領域と考えて下さい。 イ.i = i++; iにiを代入してからiをインクリメントした値を作成する。 (1) work ← i (2) i ← work (3) work ← work + 1 つまり、i=i++;とすると、いつまでもi==1のままなので、無限ループになります。 普通、単項演算では受け取り側変数を記述しません。下記参照 do { i++; // ++i; でも良い s=s+1; } while( i < 10 );
お礼
回答ありがとうございます。 ggaoggさんに返信したとおり、勘違いしておりました・・・。 >つまり、i=i++;とすると、いつまでもi==1のままなので、無限ループになります。 普通、単項演算では受け取り側変数を記述しません。下記参照 do { i++; // ++i; でも良い s=s+1; } while( i < 10 ); なるほど・・・ありがとうございます。
お礼
回答ありがとうございます。 i = 1; i = i++; はⅰに1をまず代入するのはわかっていたのですが、その後は i++の結果が次々入っていくのだと勘違いしていました。