アプリ版:「スタンプのみでお礼する」機能のリリースについて

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++; と、
後置インクリメントにしたところ、実行時何も表示されませんでした。
前置・後置インクリメントの違いも調べましたが、なぜこうなるのかわかりません。どなたか教えていただけないでしょうか?

それとも、こういうのは「なぜ?」と考えるだけムダなのでしょうか?

A 回答 (2件)

i = i++;


で、iが1の場合を考えてみると、
1 = 1++;
となります。
左辺にまず1が代入された後、右辺が2になりますので、
左辺は1のままです。

よって永続ループとなって、
System.out.println("1から" + i + "までの和は" + s);
の行まで処理が進んでいないために表示されないんだと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

i = 1;
i = i++;
はⅰに1をまず代入するのはわかっていたのですが、その後は
i++の結果が次々入っていくのだと勘違いしていました。

お礼日時:2008/05/25 15:54

ア.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 );
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ggaoggさんに返信したとおり、勘違いしておりました・・・。

>つまり、i=i++;とすると、いつまでもi==1のままなので、無限ループになります。
普通、単項演算では受け取り側変数を記述しません。下記参照
do {
  i++; // ++i; でも良い
  s=s+1;
} while( i < 10 );

なるほど・・・ありがとうございます。

お礼日時:2008/05/25 15:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!