C言語でのプログラミングにおいて、繰り返し処理は避けて通れない非常に重要な要素です。

そのループ処理をより柔軟に、そして効率的に制御するために用意されているのがcontinue文です。

初心者のうちは、ループを強制終了する break 文に比べて影が薄くなりがちですが、複雑な条件分岐を含むループ構造を整理する際には、この continue 文が大きな威力を発揮します。

本記事では、continue 文の基本的な仕組みから、具体的なコード例、よく比較される break 文との違い、そして実戦で役立つ活用テクニックまで、プロの視点で詳しく解説します。

continue文とは

C言語における continue 文は、ループ処理(forwhiledo-while)の途中で、「その回の残りの処理をスキップして、次の反復の先頭に戻る」ために使用されるジャンプ文の一種です。

通常、ループはブロック内の最後の処理まで実行してから条件式に戻りますが、continue 文が実行されると、それ以降に記述されているコードは一切実行されず、強制的にループの更新処理や条件評価へと処理が移ります。

continue文の基本構文

continue 文の記述方法は非常にシンプルです。

C言語
continue;

このように、セミコロンを含めて一行記述するだけで機能します。

一般的には、if 文による条件分岐と組み合わせて、「特定の条件下では以降の処理を行いたくない」という場合に使用されます。

continue文の基本的な使い方

continue 文は、ループの種類によってジャンプ先の位置がわずかに異なります。

ここでは、最も頻繁に利用される for 文と while 文を例に、具体的な挙動を確認していきましょう。

for文における動作例

for 文の中で continue が呼び出されると、処理は即座に更新式(カウンタ変数の増減など)へ飛びます。

その後、条件式の判定が行われます。

C言語
#include <stdio.h>

int main() (
    for (int i = 1; i <= 5; i++) (
        if (i == 3) (
            continue; // iが3のとき、以降のprintfをスキップ
        )
        printf("%d番目の処理を実行中\n", i);
    )
    return 0;
)

上記のプログラムを実行すると、以下のような結果が得られます。

1番目の処理を実行中
2番目の処理を実行中
4番目の処理を実行中
5番目の処理を実行中

i が 3 のとき、continue 文によって printf がスキップされ、すぐに i++ (更新式)が実行されたことがわかります。

while文における動作例

while 文の場合、continue 文が実行されると条件式の判定へ直行します。

for 文とは異なり、自動的にカウンタ変数が更新されるわけではないため、記述場所には注意が必要です。

C言語
#include <stdio.h>

int main() (
    int i = 0;
    while (i < 5) (
        i++;
        if (i == 3) (
            continue;
        )
        printf("値: %d\n", i);
    )
    return 0;
)

このコードでは、i が 3 になった瞬間に continue が働き、printf を飛ばして while (i < 5) の判定に戻ります。

continueとbreakの違い

continue 文と並んでよく使われるのが break 文です。

どちらもループの制御フローを変更するものですが、その役割は決定的に異なります。

動作の決定的な違い

両者の最大の違いは、「ループ自体を終わらせるか、その回だけを飛ばすか」という点にあります。

  • break文:実行された瞬間に、ループブロック全体から完全に脱出します。
  • continue文:現在の反復(イテレーション)の残りをスキップし、次の反復を開始しようとします。

比較表

以下の表に、それぞれの特徴をまとめました。

特徴continue文break文
主な目的特定の条件時に処理をスキップするループを強制的に打ち切る
実行後の挙動ループの先頭(または更新式)に戻るループの直後の処理へ移動する
ループの継続継続される(条件が真である限り)終了する
主な用途データのフィルタリング、不正値の除外目的の値が見つかった際の探索終了

具体的な使い分けのイメージ

例えば、100人のリストから「20歳以上の人だけにメールを送る」という処理を考えてみましょう。

もし20歳未満の人を見つけた場合、continue を使えば「その人の送信処理を飛ばして、次の人を確認する」ことができます。

一方で、もし「メール送信サーバーにエラーが発生した」という重大なトラブルが起きた場合は、break を使って「以降の全員への送信処理を中止する」という判断が必要になります。

continue文を活用するメリット

continue 文を適切に活用することで、コードの品質を大幅に向上させることができます。

特に大規模な開発においては、可読性の維持が極めて重要です。

ネストを浅くする(ガード節の役割)

continue 文を使わない場合、特定の条件に合致するときだけ処理を行うために、if 文の中に長い処理を書くことになります。

これが重なると、コードの階層(ネスト)が深くなり、読みづらくなります。

【continueを使わない場合】

C言語
for (int i = 0; i < 100; i++) (
    if (data[i] != NULL) (
        if (data[i]->isValid) (
            if (data[i]->type == TARGET_TYPE) (
                // ここにメインの長い処理が書かれる
            )
        )
    )
)

【continueを使った場合】

C言語
for (int i = 0; i < 100; i++) (
    if (data[i] == NULL) continue;
    if (!data[i]->isValid) continue;
    if (data[i]->type != TARGET_TYPE) continue;

    // メインの処理をインデントを下げずに記述できる
)

このように、「処理を継続できない条件」を先に判定してスキップする手法(ガード節のような考え方)を採ることで、メインロジックが明確になり、バグの混入を防ぎやすくなります。

continue文を使用する際の注意点

非常に便利な continue 文ですが、使用にあたってはいくつかの落とし穴が存在します。

特に初心者の方は以下の点に注意してください。

1. 無限ループのリスク(while文)

while 文で continue を使用する場合、カウンタ変数の更新処理(例: i++)の位置に注意しなければなりません。

C言語
int i = 0;
while (i < 10) (
    if (i == 5) (
        continue; // ここで戻ると、iは5のまま
    )
    printf("%d\n", i);
    i++; // continueされると、この更新処理が実行されない!
)

上記のコードでは、i が 5 になった瞬間に continue が実行されます。

しかし、i++ はその後に記述されているため、i は 5 のまま変化せず、再び while の条件判定に戻ります。

結果として、永遠に i == 5 の状態でループが回り続ける無限ループに陥ってしまいます。

2. 多重ループにおける挙動

continue 文は、「現在実行されている一番内側のループ」に対してのみ作用します。

C言語
for (int i = 0; i < 3; i++) (
    for (int j = 0; j < 3; j++) (
        if (j == 1) continue; // 内側のループ(jのループ)だけをスキップ
        printf("i=%d, j=%d\n", i, j);
    )
)

この場合、j == 1 のときにスキップされるのは j のループ内の処理だけであり、外側の i のループには影響を与えません。

もし外側のループまで制御したい場合は、フラグ変数を利用するか、場合によっては goto 文の検討が必要になることもあります(ただし、goto は慎重に扱うべきです)。

3. switch文との関係

C言語の仕様上、continue 文は forwhiledo-while のループの中でのみ有効です。

switch 文のケース内で continue を記述した場合、その switch 文を囲んでいるループに対して作用します。

switch 文自体を抜けるための break と混同しないようにしましょう。

実践的なプログラム例

ここでは、continue 文を用いた実用的なプログラムの例を紹介します。

例題1:偶数のみを合計するプログラム

1から10までの数値のうち、奇数を飛ばして偶数だけを足し合わせる処理です。

C言語
#include <stdio.h>

int main() (
    int sum = 0;
    for (int i = 1; i <= 10; i++) (
        // 奇数の場合は加算処理をスキップ
        if (i % 2 != 0) (
            continue;
        )
        sum += i;
        printf("%d を加算しました。現在の合計: %d\n", i, sum);
    )
    return 0;
)

例題2:特定の値(欠損データ)を除外する処理

配列の中に含まれる特定の無効な値(例えば -1)を無視して、平均値を計算するようなケースです。

C言語
#include <stdio.h>

int main() (
    int scores[] = (85, -1, 70, 92, -1, 60);
    int count = 0;
    int total = 0;

    for (int i = 0; i < 6; i++) (
        // 欠損データ(-1)の場合はカウントも合計もしない
        if (scores[i] == -1) (
            continue;
        )
        total += scores[i];
        count++;
    )

    if (count > 0) (
        printf("有効なデータ数: %d, 平均点: %.1f\n", count, (double)total / count);
    )

    return 0;
)

このように、「特定の条件を満たす要素を無視する」というロジックにおいて、continue 文は非常に直感的なコーディングを可能にします。

まとめ

C言語のcontinue文は、ループ処理の流れを制御し、特定の反復ステップを効率よくスキップするための強力な道具です。

本記事のポイントを振り返ると以下の通りです。

  • continue はループの残りの処理を飛ばし、次の反復(更新・条件判定)へ移行する。
  • break はループそのものを完全に脱出するが、continue はループを継続する。
  • for 文では更新式へ、while 文では条件判定へジャンプする。
  • ネストの深い if 文を避け、コードの可読性を高める「ガード節」として有用。
  • while 文での使用時は、無限ループを防ぐためにカウンタ更新の位置に注意が必要。

プログラムが複雑になればなるほど、条件分岐の整理が重要になります。

continue 文を使いこなすことで、読みやすくメンテナンス性の高いソースコードを書けるようになります。

まずは簡単なループ処理から取り入れて、その挙動に慣れていくことから始めてみてください。