6日でできる 新C言語入門|ループ中の処理をスキップするcontinue文

必要ない処理は飛ばして、次の繰り返しへ進む。
continue文を理解して、ループ処理をすっきり制御できるようになろう。

C言語でfor文やwhile文を使っていると、繰り返しの途中で「この回だけは残りの処理を実行したくない」という場面があります。

たとえば、1から10までの数値を順番に処理しているときに、特定の数だけ表示しないようにしたい場合があります。また、入力された値を処理するときに、条件に合わない値だけを飛ばして、次の入力へ進みたい場合もあります。

このようなときに使えるのがcontinue文です。

continue文は、現在の繰り返し回の残りの処理をスキップし、次の繰り返しへ進むための制御文です。break文のようにループ全体を終了するのではなく、あくまで今の1回分だけを途中で切り上げます。

そのため、continue文を使うと、条件に合わないデータを飛ばしたり、特定の値だけ処理対象から外したりできます。ループの中で不要な処理を避けたいときに、とても便利です。

ただし、continue文はループの流れを途中で変えるため、使い方を間違えると処理の順番が分かりにくくなったり、while文で無限ループの原因になったりすることもあります。

この記事では、continue文の基本的な動き、for文での使い方、while文で使うときの注意点、break文との違い、実践的な活用例まで、サンプルプログラムを使いながらやさしく解説していきます。

continue文は現在の回だけをスキップする

continue文は、ループの中で使う命令です。continue文に到達すると、その下にある処理は実行されず、次の繰り返しへ進みます。

基本的な考え方は、次のようになります。

ループ開始
    処理1

    if (スキップしたい条件) {
        continue;
    }

    処理2
ループ継続

この場合、スキップしたい条件が成り立つと、処理2は実行されません。その回の残りは飛ばされ、次の繰り返しへ進みます。

制御文動き
continue文現在の回の残りをスキップして、次の繰り返しへ進む
break文ループそのものを終了する
通常の処理上から順番に最後まで実行する

continue文は、for文、while文、do〜while文の中で使えます。ただし、ループの種類によって、continueの後に進む位置が少し異なります。

ループcontinue後の動き
for文増分式へ進み、その後で条件式を判定する
while文条件式の判定へ戻る
do〜while文条件式の判定へ進む

特にwhile文では、continueより前に更新処理を書いておかないと、同じ条件のままループし続けることがあります。この点は後で詳しく説明します。

図:continue文は現在の回だけをスキップする

この図から分かること

この図から分かるのは、continue文がループ全体を止めるのではなく、現在の繰り返し回だけを途中でスキップするという点です。

スキップ条件が成り立つと、その下にある処理Bは実行されず、すぐ次の繰り返しへ進みます。条件が成り立たない場合は、通常どおり処理Bまで実行されます。continue文は、不要な処理を飛ばしながらループを続けたいときに使います。

for文でcontinue文を使う

for文でcontinue文を使うと、continueに到達した時点で、その回の残りの処理をスキップします。その後、for文の増分式が実行され、条件式の判定へ進みます。

たとえば、1から8までの数値を順番に見ていき、3の倍数だけ表示しないようにする処理を考えてみましょう。

プロジェクト/ファイル名: Lesson30_1/main.c

#include <stdio.h>

int main(void) {
    int i;

    // 1から8まで順番に確認する
    for (i = 1; i <= 8; i++) {
        // 3の倍数は表示せず、次の繰り返しへ進む
        if (i % 3 == 0) {
            continue;
        }

        // 3の倍数ではない値だけ表示する
        printf("表示する値: %d\n", i);
    }

    return 0;
}

実行結果

表示する値: 1
表示する値: 2
表示する値: 4
表示する値: 5
表示する値: 7
表示する値: 8

このプログラムでは、iが1から8まで変化します。ただし、i % 3 == 0が成り立つと、continue文が実行されます。

iが3や6のとき、continue文によってprintfの行がスキップされます。そのため、3と6は表示されません。

for文でのcontinue文の流れ

for文では、continue文のあとに増分式が実行されます。

今回のfor文は、次のようになっています。

for (i = 1; i <= 8; i++)

この場合、continue文が実行されても、i++は行われます。そのため、次の値へ進むことができます。

iの値i % 3 == 0continue文printfの実行
1実行しない表示する
2実行しない表示する
3実行する表示しない
4実行しない表示する
5実行しない表示する
6実行する表示しない
7実行しない表示する
8実行しない表示する

このように、continue文を使うと、特定の条件に当てはまる回だけ処理を飛ばせます。

continue文は条件に合わないデータを飛ばすときに便利

continue文は、すべてのデータを同じように処理するのではなく、一部だけを処理対象から外したいときに便利です。

たとえば、次のような場面で使えます。

使いどころ
特定の数値を飛ばす3の倍数は表示しない
条件に合わない入力を無視する負の値は処理しない
対象外のデータをスキップする欠席者の点数は集計しない
不要な処理を避ける条件を満たさない場合は計算しない

continue文を使うと、条件に合わない場合を先に除外できるため、その後の処理を読みやすくできることがあります。

while文でcontinue文を使う

continue文はwhile文でも使えます。ただし、while文では注意が必要です。

while文では、continue文が実行されると、すぐに条件式の判定へ戻ります。そのため、カウンタの更新処理がcontinue文より後ろにあると、その更新処理がスキップされてしまいます。

次のサンプルでは、while文を使って1から6までの数値を確認し、4だけをスキップします。

プロジェクト/ファイル名: Lesson30_2/main.c

#include <stdio.h>

int main(void) {
    int n = 0;

    // nが6未満の間、繰り返す
    while (n < 6) {
        // 先にnを1増やしておく
        n++;

        // nが4のときは、下の表示処理をスキップする
        if (n == 4) {
            continue;
        }

        // 4以外の値を表示する
        printf("nの値: %d\n", n);
    }

    return 0;
}

実行結果

nの値: 1
nの値: 2
nの値: 3
nの値: 5
nの値: 6

このプログラムでは、n++をcontinue文より前に書いています。そのため、nが4のときにcontinue文で表示処理をスキップしても、nの値はすでに更新されています。

もしn++をcontinue文より後ろに書いてしまうと、nが4になった時点でn++が実行されず、nが4のままになってしまう可能性があります。その場合、同じ条件でcontinue文が繰り返され、ループが終わらなくなる危険があります。

図:while文では更新処理の位置に注意する

この図から分かること

この図から分かるのは、while文でcontinue文を使う場合、更新処理の位置がとても重要だということです。

continue文が実行されると、その下にある処理は実行されません。そのため、カウンタを増やす処理がcontinue文より後ろにあると、値が変化しないまま次の条件判定へ戻る可能性があります。while文では、必要な更新処理をcontinue文より前に置くことを意識すると、安全に書きやすくなります。

while文でcontinue文を使うときの注意点

while文は、for文のように増分式がループの見出し部分にまとまっていません。条件に使う変数の更新は、本文の中に自分で書く必要があります。

そのため、continue文を使うときは、次の点を確認しましょう。

確認すること内容
条件に使う変数while文の条件式に使っている変数は何か
更新処理の位置continue文より前に必要な更新があるか
終了条件いつループが終わるのか
スキップ後の流れcontinue後にどこへ戻るのか

特に、while文の中で入力値やカウンタを使っている場合、continue文によって必要な処理が飛ばされていないか確認することが大切です。

実践例:条件に合う値だけ表示する

continue文は、不要な値を飛ばし、条件に合う値だけを処理したいときにも使えます。

次のプログラムでは、1から10までの数値のうち、3の倍数だけを表示します。3の倍数ではない値は、continue文でスキップします。

プロジェクト/ファイル名: Lesson30_3/main.c

#include <stdio.h>

int main(void) {
    int i;

    // 1から10まで順番に確認する
    for (i = 1; i <= 10; i++) {
        // 3の倍数ではない場合は、表示処理をスキップする
        if (i % 3 != 0) {
            continue;
        }

        // 3の倍数だけ表示する
        printf("%dは3の倍数です\n", i);
    }

    return 0;
}

実行結果

3は3の倍数です
6は3の倍数です
9は3の倍数です

このプログラムでは、i % 3 != 0が真のときにcontinue文を実行しています。つまり、3で割り切れない数は処理対象から外しています。

その結果、printfが実行されるのは3、6、9のときだけです。

continue文を使うと条件外の処理を早めに除外できる

continue文を使うと、処理したくない条件を先に書いて、早めに次の繰り返しへ進めます。

今回のサンプルでは、3の倍数ではない場合にcontinue文を実行しています。

if (i % 3 != 0) {
    continue;
}

この書き方にすると、下のprintfは3の倍数である場合だけ実行されます。

つまり、処理したい条件だけを深くネストする必要がなくなります。

continue文を使わずに書くと、次のようになります。

if (i % 3 == 0) {
    printf("%dは3の倍数です\n", i);
}

このように単純な場合は、continue文を使わなくても十分読みやすいです。continue文は、スキップした後に多くの処理が続く場合や、対象外のデータを先に除外したい場合に効果的です。

continue文とbreak文の違い

continue文とbreak文は、どちらもループの流れを変える命令です。ただし、動きは大きく違います。

制御文動きループは続くか
continue文現在の回の残りをスキップして、次の繰り返しへ進む続く
break文ループをその場で終了する続かない

continue文は、その回だけを飛ばす命令です。ループ自体は続きます。

break文は、ループそのものを終わらせる命令です。break文が実行されると、それ以降の繰り返しは行われません。

たとえば、1から5までのループでiが3のときにcontinue文を実行すると、3の回だけ処理を飛ばして、4、5へ進みます。

一方、iが3のときにbreak文を実行すると、そこでループが終了し、4、5の処理は行われません。

図:continue文とbreak文の違い

この図から分かること

この図から分かるのは、continue文とbreak文はどちらもループの流れを変えるものの、進む先が違うという点です。

continue文は、現在の回の残りを飛ばして次の繰り返しへ進みます。break文は、ループそのものを終了して外へ抜けます。特定の回だけ処理を飛ばしたいならcontinue文、ループを終わらせたいならbreak文を使います。

continue文を使うときの注意点

continue文は便利ですが、使いすぎるとループの流れが追いにくくなることがあります。

特に、1つのループの中にcontinue文がいくつもあると、どの条件でどの処理がスキップされるのか分かりにくくなります。

注意点内容
使いすぎない多用すると流れが読みにくくなる
スキップされる処理を確認するcontinue文の下にある処理は実行されない
while文では更新処理に注意する更新処理が飛ばされると無限ループの原因になる
break文と混同しないcontinue文はループを終了しない
コメントを活用するなぜスキップするのかを説明すると読みやすい

continue文は、処理対象外のデータを早めに除外したいときに役立ちます。ただし、条件分岐だけで十分読みやすい場合は、無理にcontinue文を使わなくても構いません。

continue文が向いている場面

continue文は、次のような場面に向いています。

条件に合わないデータを飛ばす

たとえば、入力された値のうち、負の値は計算対象にしない、0は集計から外す、といった場合です。

特定の回だけ処理しない

たとえば、1から10までの中で、特定の数だけ表示しないようにしたい場合です。

早めに対象外を除外したい

ループの後半に長い処理が続く場合、先にスキップ条件を書いてcontinue文で飛ばすと、必要な処理だけを読みやすくできます。

場面continue文の使い方
不要な値を除外する条件に合わない値でcontinue文を実行する
特定の値を飛ばす対象外の値だけスキップする
条件外の処理を避ける下にある重い処理を実行しない
入力チェック無効な入力を飛ばして次へ進む

continue文は、すべての回を同じように処理するのではなく、条件に応じて一部だけ処理しない場合に便利です。

continue文を読みやすく使うコツ

continue文を読みやすく使うには、スキップする理由をはっきりさせることが大切です。

スキップ条件を短く分かりやすくする
if (i % 3 != 0) {
    continue;
}

このように、条件が短く明確だと、なぜスキップするのかが分かりやすくなります。

コメントで意図を補足する

学習段階では、continue文の近くにコメントを書いておくと理解しやすくなります。

// 3の倍数ではない値は表示しない
if (i % 3 != 0) {
    continue;
}
その下に何があるかを確認する

continue文の下にある処理は、スキップ条件が成り立ったときには実行されません。そのため、重要な更新処理や後片付け処理をcontinue文の下に置いていないか確認しましょう。

単純な場合はif文だけでもよい

continue文を使わなくても、if文だけで十分読みやすい場合があります。特に短い処理では、無理にcontinue文を使わないほうが自然なこともあります。

continue文を理解するとループ処理を細かく制御できる

continue文を使えるようになると、ループの中で条件に応じて処理を細かく調整できるようになります。

break文がループを終了するための命令であるのに対して、continue文はその回だけをスキップして次の繰り返しへ進む命令です。この違いを理解しておくと、ループ処理の流れをより柔軟に書けます。

for文では、continue文のあとに増分式へ進みます。while文では、continue文のあとに条件式の判定へ戻ります。そのため、while文で使う場合は、更新処理がスキップされないように特に注意が必要です。

continue文は、不要な処理を飛ばしたいとき、対象外のデータを除外したいとき、条件に合う値だけを処理したいときに役立ちます。まずは短いサンプルを動かしながら、どの処理が実行され、どの処理が飛ばされるのかを確認していきましょう。