ユーニックス総合研究所

  • home
  • archives
  • c-continue

明快!C言語のcontinue文の使い方

  • 作成日: 2022-02-07
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のcontinue文の使い方

C言語ではループ文(for, while, do-while)を扱うことができます。
このループ文と一緒に使えるのが「continue文(コンティニューぶん)」です。

continue文はループ中で処理を飛ばしたい時などに使います。
continue文を使うと楽に書ける処理もあるので重宝します。

この記事ではC言語のcontinue文について具体的に解説します。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】
コードで見るC言語とC++の7つの違い

continue文の書き方

C言語のcontinue文は↓のように書きます。

continue;  

continue文はループ文の中でのみ使える文です。
そのため実際には↓のように使います。

int i;  

for (i = 0; i < 4; i += 1) {  
    continue;  
}  

i = 0;  
while (i++ < 4) {  
    continue;  
}  

i = 0;  
do {  
    continue;  
} while (i++ < 4);  

C言語のループ文はfor文、while文、do-while文の3つです。
それぞれcontinue文を使うことが可能です。

continue文の効果

C言語のcontinue文の効果はずばり↓です。

  • continue文を書いた以降の処理をスキップする

ループ中でcontinue文を書いた場合、そのcontinue文が実行されるとcontinue文以降の処理がスキップされます
「スキップする」とはループを1回省略するということです。

for文とcontinue文

たとえば↓のfor文のcontinue文を見てください。

#include <stdio.h>  

int main(void) {  
    for (int i = 0; i < 4; i += 1) {  
        if (i == 2) {  
            continue;  
        }  
        printf("%d\n", i);  
    }  

    return 0;  
}  

↑のコードをコンパイルして実行すると↓の結果になります。

0  
1  
3  

↑のfor文はカウント変数i0から4より下までの間、ループするfor文です。
そしてif文でカウント変数i2のときにcontinue文を実行しています。
このようなコードを書くと、カウント変数i2のときにcontinue以降の処理、つまりprintf()がスキップされます。

カウント変数i2の時はprintf()が実行されないので、出力結果に2の値は出力されません。

continue文はループ文の中にいくつも書くことができます。

#include <stdio.h>  

int main(void) {  
    for (int i = 0; i < 4; i += 1) {  
        if (i == 1) {  
            continue;  
        }  
        if (i == 2) {  
            continue;  
        }  
        printf("%d\n", i);  
    }  

    return 0;  
}  

↑の場合、結果は↓になります。

0  
3  

カウント変数i1の時と2の時にcontinue文が実行されます。
continue文が実行されると以降の処理はスキップされるわけですね。
i == 1のときはcontinue以降のif文やprintf()がまるっとスキップされます。

🦝 < なかなか豪快である

🐭 < 豪気かな

while文とcontinue文

while文の場合もfor文の場合と同じです。

#include <stdio.h>  

int main(void) {  
    int i = 0;  
    while (i++ < 4) {  
        if (i == 2) {  
            continue;  
        }  
        printf("%d\n", i);  
    }  

    return 0;  
}  

↑のコードの結果は↓になります。

1  
3  
4  

ちなみにif文を書かなくてもcontinue文を使うことはできます

#include <stdio.h>  

int main(void) {  
    int i = 0;  
    while (i++ < 4) {  
        continue;  
        printf("%d\n", i);  
    }  

    return 0;  
}  

↑の場合はループ文の先頭で常にcontinue文が実行されます。
そうするとprintf()は実行されません。
よって↑のコードをコンパイルして実行しても何も出力されません!

do-while文とcontinue文

do-while文の場合も他のループ文と同様です。

#include <stdio.h>  

int main(void) {  
    int i = 0;  
    do {  
        if (i == 2) {  
            continue;  
        }  
        printf("%d\n", i);  
    } while (i++ < 4);  

    return 0;  
}  

↑の結果は↓になります。

0  
1  
3  
4  

ループ文の入れ子とcontinue文

ループ文を入れ子、つまり2重にしている場合にcontinue文を使うとどうなるのでしょうか?
ループ文1の中にループ文2を書いて、ループ文2の中でcontinue文を実行した場合、continue文が作用するのはループ文2のみになります。

#include <stdio.h>  

int main(void) {  
    // 外側のfor文  
    for (int i = 0; i < 2; i += 1) {  
        // 内側のfor文  
        for (int j = 0; j < 4; j += 1) {  
            if (j == 2) {  
                continue;  // 内側のfor文のみに作用する  
            }              
            printf("%d\n", j);  
        }  
    }  

    return 0;  
}  

↑のコードの結果は↓になります。

0  
1  
3  
0  
1  
3  

↑のコードの場合、外側のfor文と内側のfor文があります。
そしてcontinue文は内側のfor文に書かれています。
この場合、continue文は内側のfor文に対してのみ作用します

continue文のテクニック「ソニック」

continue文はcontinue文の以降の処理をスキップします。
この特性を利用したテクニックが「ソニック」です。

continue文を書いて処理を区切ることで複雑な処理を簡略的に書くことができます。
たとえば「カウント変数の値に応じて加算する値を変える」というような処理を考えてみます。
これはswitch文を使えば↓のように書くことができます。

#include <stdio.h>  

int main(void) {  
    int j = 0;  

    for (int i = 0; i < 4; i += 1) {  
        switch (i) {  
        case 0: j += 1; break;  
        case 1: j += 2; break;  
        case 2: j += 3; break;  
        default: j += 4; break;  
        }  
    }  

    printf("%d\n", j);  // 10  

    return 0;  
}  

シンプルで美しいですね。
これをソニックで書き直すと↓のようになります。

#include <stdio.h>  

int main(void) {  
    int j = 0;  

    for (int i = 0; i < 4; i += 1) {  
        if (i == 0) {  
            j += 1;  
            continue;  
        }  
        if (i == 1) {  
            j += 2;  
            continue;  
        }  
        if (i == 2) {  
            j += 3;  
            continue;  
        }  
        j += 4;  
    }  

    printf("%d\n", j);  // 10  

    return 0;  
}  

少しコードが長くなってしまいましたが、このようなコードを書いて何か得があるのでしょうか?
カウント変数を条件にしている場合はあまりその恩恵は感じられませんが、この書き方は色々なシーンんで使えます

↑のようにif文とcontinue文を組み合わせればelse ifelseを書く必要もありません。
continue文を実行した時点で次の処理を考えなくていいので、コードが分割統治的に整理されます

このようなcontinue文の使い方は、関数内でreturn文を呼び出す場合と似ています
return文を実行した段階で、それ以降の処理のことは考えなくていいので開発者の負担が減らせます。
このcontinue文にはこれと同じ効果があります

*注:ソニックという名称はこのブログで考えた名称です。他では通用しないのでご注意ください。

おわりに

今回はC言語のcontinue文を解説しました。
continue文は覚えておくとループ処理を便利に書くことができます。
break文といっしょに覚えておくと吉と言えます。

🦝 < 処理をスキップしよう

🐭 < 処理を飛ばそう