continue文 - 次のループの先頭へ移動

continue文を使うと、次のループの先頭へ移動できます。for文while文とのブロックの中で使用できます。

for (ループ変数初期化;ループする条件;ループ変数更新) {
  
  # 次のループへ移動
  continue;
}

while (ループする条件) {
  
  # 次のループへ移動
  continue;
}

for文のブロックの中でcontinue文を使って、次のループへ移動するサンプルです。偶数の時だけスキップして、次のループの先頭に移動しています。

#include <stdint.h>
#include <stdio.h>

int main(void) {
  
  // for文で合計を求める
  int32_t total = 0;
  for (int32_t i = 0; i < 10; i++) {
    // 偶数のときだけ次のループへ移動
    if (i % 2 == 0) {
      continue;
    }
    
    total += i;
  }
  
  printf("%d\n", total);
}

出力結果

25

goto文とcontinue文の関係性

continue文は、一種のgoto文です。次のループの先頭に移動するという移動先の限定されたgoto文と考えてよいです。

C言語では、できる限りgoto文を使わずにプログラムを書くのが良い作法とされています。

continue文とif文の使い分け

continue文とif文はどのように使い分けるのでしょうか。先ほど書いたサンプルは、if文でも書けますよね。

#include <stdint.h>
#include <stdio.h>

int main(void) {
  
  // for文で合計を求める
  int32_t total = 0;
  for (int32_t i = 0; i < 10; i++) {
    if (i % 2 != 0) {
      total += i;
    }
  }
  
  printf("%d\n", total);
}

ぶっちゃけると、すべてのプログラムはwhile文とif文があれば、書けます。それ以外の構文は、シンタックスシュガー(糖衣構文)です。

(そのー、もっと厳密に書くと、goto文とif文だけで書ける。でもまぁ、gotoは、使いたくないしね。もっと低レベルのアセンブラになると、単純ジャンプ(C言語のgotoに該当)と条件ジャンプ(C言語のif文に該当)がもっとも基本的な制御命令です。ループは、コードの前方の位置に条件ジャンプすると書く。)

ただ、ある分岐を表現するのに、continue文を使った方が、見通しが良いという場合があり、その場合にcontinueを使います。

たとえば、行の先頭の場合だけを、例外的に扱いたいので、スキップしたいという場合などです。

while (条件) {
  // 行が先頭だったらスキップ
  if (line == 1) {
    continue;
  }
  
  // メインの処理
}

これは、if文でも書けます。メインの処理の入れ子が一つ深くなっていますね。

while (条件) {
  // 行が先頭だったらスキップ
  if (line =! 1) {
    // メインの処理
  }
}

コンピューターから見ればどちらも同じですが、メイン処理を強調したい場合は、例外的なものをcontinue文で飛ばすという書き方ができます。

人間の感性や知覚のしやすさのための使い分けという感じでしょうか。

次のループへ移動する文のPerlとの違い

C言語のcontinue文は、Perlのnext文に該当します。

関連情報