breakを理解する
break文はループまたはswitchの途中から抜ける制御文です。どの構文を終了するかと、終了後にどの文へ進むかを明確にし、検索や入れ子の処理を追います。
この単元で学ぶこと
- breakの終了対象を判断する
- break後に省略される処理を追う
- ラベルありbreakの到達先を判定する
本文解説
途中で繰返しを終える for(int i=0;i<5;i++){if(i==2)break;print(i);}は01です。i=2でbreakすると表示より先にループを抜けます。条件が上限に達するまで待たず、目的の値を見つけた段階で検索を終える用途に使えます。
breakの位置 表示してからif(i==2)break;なら012になります。breakより前の処理は取り消されません。同じ終了条件でも、本体内の文の順序により表示や合計へ含まれる最後の値が変わります。
ループ後へ進む while内でbreakした後、ループ直後のprintは実行します。メソッドを終了するreturnとは違います。検索ではループ内で見つかった位置を変数へ保存し、抜けた後の共通処理でその結果を利用します。
forの更新は省略する int i=0;for(;i<5;i++){if(i==2)break;}の後でiは2です。breakで抜けた反復の更新式i++は実行しません。continueで次の反復へ進む場合との重要な違いです。
最も内側を抜ける 二重ループで内側のbreakを実行すると内側だけが終わり、外側本体の残りや次の反復は続きます。外側まで一度に抜けたい場合は、外側にラベルを付けbreak outer;のように対象を明示できます。
switchも終了対象 ループの中にswitchがある場合、switch内のbreakはswitchを終了します。ループを必ず終了するわけではありません。if自体はbreakの対象ではなく、if内に書いたbreakは周囲のループやswitchを探します。
ラベル付きのブロック outer:{print("A");break outer;}print("B");ならABです。ラベルありbreakはループだけでなくラベル付きブロックも終了できます。ラベルなしbreakを普通のブロックへ書くことはできません。
到達可能性の制約 while(true){break;print("X");}はbreak直後の文が到達不能でコンパイルエラーです。一方条件付きif内のbreakなら、条件が成立しない経路で後の文へ到達できます。実行経路とコンパイラの到達可能性規則を区別して判定します。
図解
重要ポイント
- ラベルなしbreakは最も内側のループまたはswitchを抜ける。
- ifはbreakの終了対象にならない。
- break後は対象構文の直後へ進む。
- ラベルありbreakはそのラベルの文全体を抜ける。
間違えやすい点
- breakをメソッド全体の終了と思わない。
- 内側ループのbreakで外側まで終了したと考えない。
- 無条件breakの直後に到達不能な文を書かない。
用語解説
- break
- 指定されたループ、switch、ラベル文から抜ける制御文。
- ラベル
- name:の形で文へ付ける名前。
- 到達不能
- 実行が到達しないとコンパイル時規則で判断される状態。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。