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も条件を無視して無条件に再開するわけではありません。
安全な検証 終了することを確認した短い入力で動かします。分岐先を図にし、更新される変数を一つずつ追跡します。無限ループの誤りは実行して待つのではなく、同じ値と条件へ戻る経路を見つけて修正します。
図解
重要ポイント
- breakは対象のループ等を終了する。
- continueはその回の残りを飛ばす。
- forのcontinueは更新欄を実行してから条件へ進む。
- ラベルなしでは最も内側の対象へ作用する。
間違えやすい点
- breakでメソッド全体が必ず終わると考えない。
- continueが更新を常に省略すると考えない。
- whileの更新を飛ばす経路を作らない。
用語解説
- break
- 対象の反復やswitch等を抜ける文。
- continue
- 対象の反復の次の回へ進む文。
- 入れ子
- ある制御構造の本体に別の制御構造を置くこと。
- 更新欄
- 基本forの第三部分。次の条件判定より前に実行する。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。