ラベル付きbreak

ラベル付き break

このレッスンでできるようになることは、多重ループの中の break と continue が、どのループを抜けるのかを正しく追えることです。

まず予測してください

StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { if (j == 2) { break; } sb.append(i).append(j).append(" "); } }

出力は 11 21 31 です。break は「自分を囲むいちばん内側のループ」だけを抜けます。外側の for は止まらないので、i は 3 まで進みます。

ここで break を break outer; に変え、外側の for に outer: というラベルを付けると、出力は 11 だけになります。外側のループごと終わるからです。

ラベルの書き方

ラベルは識別子のあとにコロンを置き、その直後の文に付けます。付けられるのは for、while、do-while だけではなく、任意の文とブロックです。ただし試験に出るのはほぼループです。

outer: for (int i = 1; i <= 3; i++) { inner: for (int j = 1; j <= 3; j++) { if (i * j > 4) { break outer; } } }

ラベル名は変数名と同じ規則で付けられます。変数と同じ名前でも衝突しません。

continue にもラベルが付く

最初のコードの break を continue に変えると、出力は 11 13 21 23 31 33 になります。j が 2 の周回だけを飛ばし、j は 3 まで進むからです。ここを continue outer; にすると出力は 11 21 31 に変わります。外側のループの更新部へ飛ぶので、内側のループはそこで打ち切られ、i が 1 つ進んで次の周回に入ります。

試験で狙われるところ

ラベルは「ジャンプ先」ではありません。break outer; はラベルの位置に戻るのではなく、ラベルが付いた文を終わらせます。goto のように上へ戻ると勘違いさせる選択肢が必ず混ざります。また、ラベルの付いたループの外側で break outer; と書くとコンパイルエラーになります。

要件

  1. 外側の for にラベルを付け、打ち切りは break ラベル名; で行う
  2. 積が limit を超えた値は記録しない
  3. 記録した値はカンマ区切りでつなぐ。末尾にカンマを残さない
  4. 1 つも記録できなかったときは "empty" を返す

入出力例

scan(4)"1,2,3,2,4" scan(100)"1,2,3,2,4,6,3,6,9" scan(0)"empty"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

ラベル付きbreak

⌘S で保存