探し物をしています。棚を端から見ていって、見つかったらそこでやめる。これがbreakです。仕分けをしています。対象外のものは飛ばして次へ。これがcontinueです。
break — いま入っているループ(または switch)をその場で抜ける。
continue — 本体の残りを飛ばして、次の周回へ進む。ループ自体は続く。
break から見ましょう。1から順に足していって、合計が50を超えた時点で打ち切ります。
#include <stdio.h>
int main(void) {
int sum = 0;
int i; // ループの外で宣言(後で使うため)
for (i = 1; i <= 100; i++) {
sum += i;
if (sum > 50) {
break; // 条件を満たしたので打ち切り
}
}
printf("%d まで足して %d になりました\n", i, sum);
return 0;
}1+2+…+10 = 55 で初めて50を超えるので、「10 まで足して 55 になりました」と出ます。ここで i をループの外で宣言しているのが要点です。中で宣言すると、抜けた後に i が消えていて「何周目で止まったか」を使えません。
次に continue です。3の倍数だけを表示します。
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 10; i++) {
if (i % 3 != 0) {
continue; // 3の倍数でなければ飛ばす
}
printf("%d ", i);
}
printf("\n");
return 0;
}出力は 3 6 9。もちろん if (i % 3 == 0) { printf… } と書いても同じ結果ですが、飛ばしたい条件が3つ4つと増えてくると、continue で先に弾いてしまうほうが本体が浅くなって読みやすくなります。
ここから、実際によく踏む地雷です。whileの中の continue は、更新処理を置き去りにします。
#include <stdio.h>
int main(void) {
int i = 0;
while (i < 5) {
if (i == 2) {
continue; // i++ に到達しない → 無限ループ
}
printf("%d ", i);
i++;
}
return 0;
}i が 2 になった瞬間、continue が i++ を飛ばします。i は永遠に 2 のまま、条件は永遠に真——無限ループです。forなら更新式は本体の外にあるので continue でも必ず実行されますが、while では更新も本体の一部なので飛ばされてしまいます。while + continue を書くときは、continue の前に更新を済ませるか、素直に for にしてください。
もうひとつ。break が抜けるのは、一番内側のループ1つだけです。二重ループの内側で break しても、外側は何事もなかったように回り続けます。外側も抜けたいときは、boolのフラグを立てて外側の条件でも見るのが定石です(次のトピックで実例を出します)。
最後に使いすぎの話を少し。continue や break が何か所にも散らばると、流れが目で追えなくなります。「例外的に飛ばす/打ち切る」を1〜2か所まで、が読みやすさの目安です。
まとめます。break は打ち切り、continue は次の周回へ。break が抜けるのは内側1つだけ。while の中の continue は更新を飛ばす。