• ベストアンサー

繰り返しの中断(break)についての質問

class BreakTest3{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; if(sum > 1000){ break; }   i=i+1; } System.out.println("60円のりんごは1,000円で" + i + "個買えます"); } } というソースファイルをコンパイルしてクラスファイルを実行すると 60円のりんごは1000円で16個買えますと表示されるのに 10行目のi=1+1;を6行目と7行目の間にいれてコンパイルし クラスファイルを実行すると60円のりんごは1000円で17個買えます と出ます。 これがどうしても理解できません。なぜ変わるんですか? よろしくお願いします。

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

  • ベストアンサー
noname#42542
noname#42542
回答No.2

まず、ループ内のif文を取り除くと、sumとiの関係は、 sum = i * 60 であるのが分かります。 そして、whileループからの脱出の条件が、「sumが1000を超えたとき」ですので、sum = sum + 1の直後にiの加算を行うと、i * 60の値は必然的に1,000円を超えてしまいます。 つまり、breakの後に i = i + 1; を配置することで、この 関係を断ち切っているわけです。 もし6行目の直後にiの加算を置きたい場合は、最終結果を i - 1 で出力すればいいわけです。

noname#60127
質問者

お礼

お二方回答ありがとうございます。よく理解できました。

その他の回答 (1)

回答No.1

class BreakTest3{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; System.out.println("sum_1:" + Integer.toString(sum)); System.out.println("i_1:" + Integer.toString(i)); if(sum > 1000){ break; } i=i+1; System.out.println("sum_2:" + Integer.toString(sum)); System.out.println("i_2:" + Integer.toString(i)); } System.out.println("60円のりんごは1,000円で" + Integer.toString(i) + "個買えます"); } } ======== class BreakTest4{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; i=i+1; System.out.println("sum_1:" + Integer.toString(sum)); System.out.println("i_1:" + Integer.toString(i)); if(sum > 1000){ break; } System.out.println("sum_2:" + Integer.toString(sum)); System.out.println("i_2:" + Integer.toString(i)); } System.out.println("60円のりんごは1,000円で" + Integer.toString(i) + "個買えます"); } } って書くと変数の変化がわかりやすいかな?

関連するQ&A