C言語学習ポータル(無料版) 学習コンテンツ 制御構造 breakとcontinueの使いどころ

🔀 制御構造

breakとcontinueの使いどころ

無料公開版に収録・読む目安 11分

🎯 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 にしてください。

師範while の中の continue は、更新を置き去りにする。for の更新式は置き去りにされぬ。この差だけは、体で覚えよ

もうひとつ。break が抜けるのは、一番内側のループ1つだけです。二重ループの内側で break しても、外側は何事もなかったように回り続けます。外側も抜けたいときは、boolのフラグを立てて外側の条件でも見るのが定石です(次のトピックで実例を出します)。

最後に使いすぎの話を少し。continue や break が何か所にも散らばると、流れが目で追えなくなります。「例外的に飛ばす/打ち切る」を1〜2か所まで、が読みやすさの目安です。

まとめます。break は打ち切り、continue は次の周回へ。break が抜けるのは内側1つだけ。while の中の continue は更新を飛ばす。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

break文ぶれいくぶん

ループやswitch文の実行をその場で強制的に抜け出す命令のこと。「これ以上繰り返す必要がない」と判断したときに使う。多重ループの中で使うと、いちばん内側のループだけを抜ける点に注意が必要。

continue文こんてぃにゅーぶん

ループの残りの処理を飛ばして、次の繰り返しへすぐ進む命令のこと。特定の条件のときだけ処理をスキップしたい場面で使われる。スキップされるのはあくまで残りの処理であり、ループ自体は終わらない。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

while文わいるぶん

条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。

無限ループむげんるーぷ

終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。

bool型ぶーるがた

true(真)かfalse(偽)のどちらかしか入らない型のこと。C23では標準の書き方としてbool・true・falseがそのまま使えるようになった。従来は0と1で真偽を表していたが、C23の書き方の方が意図が伝わりやすい。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ do-while文と入力チェック ループのネストと九九表 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH