break・continueとラベルの全体像
breakは繰返しから抜け、continueはその回の残りを省略します。似た位置に書けても、次に実行する場所が異なります。通常のJava 17のmain内の短いコードで移動先を追います。 Silverではさらにラベルで外側の反復やブロックを指定する場合を扱います。
この単元で学ぶこと
- breakとcontinueの移動先を区別する
- forの更新とwhileの条件への移動を追跡する
- 入れ子の最も内側の反復を識別する
- ラベル付きbreakとcontinueの合法性・対象を判定する
本文解説
二つの役割 for(int i=0;i<4;i++){if(i==2)break;System.out.print(i);}は01です。i=2でループ全体から抜けます。breakをcontinueへ変えると013です。continueはその回の表示を飛ばし、次の回へ進むためです。
位置が出力を変える System.out.print(i);if(i==2)break;という順なら012になります。分岐へ到達するより前に実行した表示を取り消す効果はありません。「何回繰り返すか」だけでなく、各文が分岐の前か後かを書き出します。
forの更新 for(int i=0;i<4;i++){if(i==2)continue;...}ではcontinueでもi++へ進み、次の条件を評価します。breakなら更新欄を通らずループ外へ移ります。外で宣言したiを後から表示すると、途中のbreakと自然終了の差が分かります。
whileで更新を置く場所 int i=0;while(i<3){i++;if(i==2)continue;System.out.print(i);}は13です。増分がcontinueより前なので進みます。増分をcontinueより後に置くと、条件が真のまま更新を飛ばし続ける場合があります。終了しない例は机上で移動先を確認してから直します。
ラベルで対象を指定 outer: for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(j==1)break outer;System.out.print(i);}}は0です。ラベルouterは外側forに付いています。break outerは内側だけでなく外側からも抜け、外側forの直後へ移ります。ラベルは変数ではなく、対象の文を識別する名前です。
外側を継続 同じ二重forでbreak outerをcontinue outerへ変えると000ではなく012です。各iでj=0を一回表示し、j=1で外側の更新i++へ進みます。内側の残りと外側本体の残りを飛ばしますが、外側forの更新は実行します。
ラベルの使える対象 exit: {System.out.print("A");if(args.length==0)break exit;System.out.print("B");}のようにラベル付きブロックをbreakで抜けることもできます。一方continueの対象ラベルは反復文に付いている必要があり、単なるブロックのラベルへのcontinueはコンパイルエラーです。存在しないラベル、囲んでいない文へのラベルも使えません。
ラベルの検証 ラベルなし、break outer、continue outerを同じ小さな二重ループで比較します。内側の表示、外側本体の末尾、外側の更新を別々に追います。対象を飛び越えて任意の位置へ移るgotoではありません。可読性のため、入れ子を減らす設計とも比較します。
図解
重要ポイント
- breakは対象のループ等を終了する。
- continueはその回の残りを飛ばす。
- forのcontinueは更新欄を実行してから条件へ進む。
- ラベルなしでは最も内側の対象へ作用する。
- continueのラベルは反復文を指す必要がある。
間違えやすい点
- breakでメソッド全体が必ず終わると考えない。
- continueが更新を常に省略すると考えない。
- whileの更新を飛ばす経路を作らない。
用語解説
- break
- 対象の反復やswitch等を抜ける文。
- continue
- 対象の反復の次の回へ進む文。
- 入れ子
- ある制御構造の本体に別の制御構造を置くこと。
- 更新欄
- 基本forの第三部分。次の条件判定より前に実行する。
- ラベル
- 対象となる文の直前に名前とコロンを付けた識別子。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。