🔀 制御構造
🎯 break でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる
探し物をしています。棚を端から見ていって、見つかったらそこでやめる。これが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 は更新を飛ばす。
ループやswitch文の実行をその場で強制的に抜け出す命令のこと。「これ以上繰り返す必要がない」と判断したときに使う。多重ループの中で使うと、いちばん内側のループだけを抜ける点に注意が必要。
ループの残りの処理を飛ばして、次の繰り返しへすぐ進む命令のこと。特定の条件のときだけ処理をスキップしたい場面で使われる。スキップされるのはあくまで残りの処理であり、ループ自体は終わらない。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。
終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。
true(真)かfalse(偽)のどちらかしか入らない型のこと。C23では標準の書き方としてbool・true・falseがそのまま使えるようになった。従来は0と1で真偽を表していたが、C23の書き方の方が意図が伝わりやすい。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。