break・continueのコードトレース

検索の打切りと対象外データの除外をコードで比較します。二重ループでも、抜ける反復と継続する反復を正確に指定して出力を予測します。

この単元で学ぶこと

  • breakとcontinueの移動先を区別する
  • forの更新とwhileの条件への移動を追跡する
  • 入れ子の最も内側の反復を識別する

本文解説

入力による打切り int[] a={4,0,7}; int s=0; for(int x:a){if(x==0)break;s+=x;}は4です。区切り値0以後を集計しない設計です。0が先頭なら0、存在しなければ全要素の合計となります。

除外と継続 同じ例のbreakをcontinueへ変えると11です。0を加算しないだけで、後ろの7は読むためです。打切り条件なのか、除外条件なのかを仕様の文章で確認します。

分岐前の加算 for(int i=1;i<=4;i++){s+=i;if(i==2)break;}ならsは3です。判定より前に2を加算しています。文の順を逆にすると1になります。ソースを読み替えるときに順序まで変えないようにします。

continueと表示位置 for(int i=0;i<3;i++){System.out.print(i);if(i==1)continue;System.out.print("X");}は0X12Xです。1は先に表示されますが、その回のXは飛ばします。本体全体がなかったことになるわけではありません。

外側の残りの文 for(int i=0;i<2;i++){for(int j=0;j<2;j++){break;}System.out.print("X");}はXXです。内側のbreak後にも外側本体の表示が残ります。内側から抜ける位置を、外側ループの外と混同しないようにします。

二重ループの回数 for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(j==i)break;c++;}}は0+1+2でc=3です。breakの位置がiに応じて変わるため、単純な3×3ではありません。continueなら各行で一回を除くので2+2+2=6です。

do-whileの継続 int i=0; do{i++;if(i==2)continue;System.out.print(i);}while(i<3);は13です。continue後は末尾の条件へ進みます。do-whileも条件を無視して無条件に再開するわけではありません。

安全な検証 終了することを確認した短い入力で動かします。分岐先を図にし、更新される変数を一つずつ追跡します。無限ループの誤りは実行して待つのではなく、同じ値と条件へ戻る経路を見つけて修正します。

図解

forの本体で分岐した後
分岐前に済ませた表示や加算は残る。

重要ポイント

  • breakは対象のループ等を終了する。
  • continueはその回の残りを飛ばす。
  • forのcontinueは更新欄を実行してから条件へ進む。
  • ラベルなしでは最も内側の対象へ作用する。

間違えやすい点

  • breakでメソッド全体が必ず終わると考えない。
  • continueが更新を常に省略すると考えない。
  • whileの更新を飛ばす経路を作らない。

用語解説

break
対象の反復やswitch等を抜ける文。
continue
対象の反復の次の回へ進む文。
入れ子
ある制御構造の本体に別の制御構造を置くこと。
更新欄
基本forの第三部分。次の条件判定より前に実行する。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。