ラベル付き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; と書くとコンパイルエラーになります。
要件
- 外側の for にラベルを付け、打ち切りは
break ラベル名;で行う - 積が limit を超えた値は記録しない
- 記録した値はカンマ区切りでつなぐ。末尾にカンマを残さない
- 1 つも記録できなかったときは
"empty"を返す
入出力例
scan(4) → "1,2,3,2,4"
scan(100) → "1,2,3,2,4,6,3,6,9"
scan(0) → "empty"ヒント
編集 LuaGate編集部