【初心者向け】C言語のcontinueステートメントを使いこなして、スマートなループ処理を実現しよう!


continue ステートメントは、ループ内の 現在のイテレーションのみをスキップ するために使用される制御フローステートメントです。 言い換えると、continue が実行されると、ループの残りのステートメントがスキップされ、ループの 次のイテレーション へとすぐに進みます。

構文

continue;

使い方

continue ステートメントは、forwhiledo-while ループの中でのみ使用できます。 以下の例をご覧ください。

for (int i = 0; i < 5; i++) {
  if (i == 2) {
    continue; // i == 2 の場合はスキップ
  }
  printf("%d\n", i);
}

この例では、i が 2 の場合は continue ステートメントが実行され、printf ステートメントがスキップされます。 よって、出力は以下のようになります。

0
1
3
4

利点

  • 繰り返し処理を効率化できる
  • 特定の条件下でのみ処理を実行したい場合に便利
  • コードをより読みやすく、簡潔に記述できる

注意点

  • ネストされたループで使用する場合、どのループから抜け出すのかを明確にする必要があります。
  • continue ステートメントは、ループ内の 現在のイテレーションのみ をスキップします。 ループ全体をスキップしたい場合は、break ステートメントを使用する必要があります。

応用例

  • 複数のループをネストさせて複雑な処理を行う場合
  • 特定の条件を満たさない限りループを続ける場合
  • 特定の値を持つ要素のみを処理するループ

continue ステートメントは、ループ内の処理を制御する便利なツールです。 適切に使用することで、コードをより読みやすく、効率的に記述することができます。



特定の値を持つ要素のみを処理するループ

この例では、1 から 10 までの整数をループし、3 の倍数のみを出力します。

for (int i = 1; i <= 10; i++) {
  if (i % 3 != 0) {
    continue;
  }
  printf("%d\n", i);
}

このコードは以下の出力を生成します。

3
6
9

特定の条件を満たさない限りループを続ける

この例では、ユーザーが入力する値が 10 になるまでループを続け、その値を出力します。

int main() {
  int input;

  do {
    printf("数値を入力してください: ");
    scanf("%d", &input);

    if (input == 10) {
      break;
    }
  } while (1);

  printf("入力された値: %d\n", input);

  return 0;
}

このコードは、ユーザーが 10 を入力するまで、入力を促し続けます。 10 が入力されると、ループが終了し、入力された値が出力されます。

複数のループをネストさせて複雑な処理を行う

この例では、2 つのループをネストさせて、2 つの配列の要素を掛け合わせて表示します。

int array1[] = {1, 2, 3};
int array2[] = {4, 5, 6};

for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    if (i == j) {
      continue;
    }
    printf("%d * %d = %d\n", array1[i], array2[j], array1[i] * array2[j]);
  }
}
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18

これらの例は、continue ステートメントをどのように使用して、ループの処理を制御できるかを示すほんの一例です。 状況に応じて、さまざまな方法で continue ステートメントを創造的に活用することができます。

  • continue ステートメントは、ループをより効率的にするために使用できますが、乱用するとコードが読みづらくなる可能性があります。 適切な状況で使用することが重要です。
  • 上記の例では、わかりやすさのためにシンプルなコードを使用しています。 実際のプログラミングでは、より複雑なロジックやエラー処理が必要になる場合があります。


goto ステートメント

goto ステートメントを使用して、ループ内の別の場所にジャンプし、残りのイテレーションをスキップすることができます。 以下の例をご覧ください。

for (int i = 0; i < 5; i++) {
  if (i == 2) {
    goto next_iteration; // i == 2 の場合はスキップ
  }
  printf("%d\n", i);
next_iteration:
}

この例は、continue ステートメントを使用した例とほぼ同じ出力を生成します。 しかし、goto ステートメントは、コードが読みづらくなり、スパゲッティコードと呼ばれるような、メンテナンスが困難なコードにつながる可能性があるという欠点があります。

別のループを使用する

場合によっては、別のループを使用して、continue ステートメントを使用するよりも、より明確で簡潔なコードを書くことができます。 以下の例をご覧ください。

int main() {
  int numbers[] = {1, 2, 3, 4, 5};

  for (int i = 0; i < 5; i++) {
    if (numbers[i] % 2 == 0) {
      continue; // 偶数の場合スキップ
    }
    printf("%d\n", numbers[i]);
  }

  // 偶数のみに絞ったループ
  for (int i = 0; i < 5; i++) {
    if (numbers[i] % 2 != 0) {
      printf("%d\n", numbers[i]);
    }
  }

  return 0;
}

この例では、最初のループはすべての要素を処理し、2 番目のループは偶数の要素のみを処理します。 この方法は、continue ステートメントを使用するよりも、コードが明確で読みやすくなります。

条件付きステートメントを使用する

場合によっては、条件付きステートメントを使用して、continue ステートメントを使用するよりも、より柔軟で制御性の高いコードを書くことができます。 以下の例をご覧ください。

for (int i = 0; i < 5; i++) {
  int result = process_number(i);

  if (result == 0) {
    continue; // 処理が成功しなかった場合はスキップ
  }

  printf("処理結果: %d\n", result);
}

この例では、process_number 関数は、処理が成功した場合は 0 以外の値を返します。 処理が成功しなかった場合は、continue ステートメントを使用して、ループの現在のイテレーションをスキップします。 この方法は、continue ステートメントを使用するよりも、コードがより柔軟で制御しやすくなります。

continue ステートメントは、ループ内の処理を制御する便利なツールですが、状況によっては、代替手段の方が適切な場合があります。 上記の代替方法を理解し、状況に応じて適切な方法を選択することが重要です。

  • パフォーマンス: 場合によっては、continue ステートメントよりも、代替手段の方がパフォーマンスが優れている場合があります。
  • コードの保守性: 将来的に変更やメンテナンスが容易なコードを書くようにしましょう。
  • コードの可読性: 常に、最も読みやすく、理解しやすいコードを書くことを心がけましょう。