C言語ループ制御の救世主!「continue」ステートメントの使い方と応用例

2024-05-16

C言語の continue ステートメントは、ループ内で使用される制御構文です。 現在のループ反復の残りの処理をスキップし、次の反復へと移行させる役割を果たします。 主に、特定の条件を満たす場合に、ループ内の処理を部分的にスキップしたい場合に使用されます。

構文

continue;

使い方

continue ステートメントは、for ループ、while ループ、do-while ループなどのループ内でのみ有効です。 ループ内で continue ステートメントが実行されると、以下の処理が行われます。

  1. 現在のループ反復の残りの処理がスキップされます。
  2. ループのループ条件が評価されます。
  3. ループ条件が true の場合、次のループ反復へと移行します。
  4. ループ条件が false の場合、ループが終了します。

以下のコードは、1 から 10 までの数字を出力しますが、5 の場合はスキップします。

for (int i = 1; i <= 10; i++) {
  if (i == 5) {
    continue;
  }
  printf("%d ", i);
}

このコードを実行すると、以下の出力が得られます。

1 2 3 4 6 7 8 9 10

応用例

continue ステートメントは、様々な場面で使用できます。 以下に、いくつか例を挙げます。

  • 特定の条件を満たす要素のみを処理する場合
  • 特定の値を持つ要素をスキップする場合
  • 偶数のみを出力する場合
  • 特定の範囲内の値のみを出力する場合

注意点

  • continue ステートメントは、ループ内でのみ使用できます。
  • ループ内で break ステートメントと併用することはできません。
  • すべてのループ反復をスキップしたい場合は、continue ステートメントではなく、ループ条件を適切に設定する方が適切な場合があります。

continue ステートメントは、ループ内の処理を制御するのに役立つ便利なステートメントです。 ループ処理をより柔軟に制御したい場合に、ぜひ活用してみてください。



C言語における continue ステートメントのサンプルコード

以下のコードは、1 から 10 までの偶数のみを出力します。

for (int i = 1; i <= 10; i++) {
  if (i % 2 == 0) {
    printf("%d ", i);
  }
}

このコードを実行すると、以下の出力が得られます。

2 4 6 8 10

特定の値を持つ要素をスキップ

以下のコードは、1 から 10 までの数字を出力しますが、5 の場合はスキップします。

for (int i = 1; i <= 10; i++) {
  if (i == 5) {
    continue;
  }
  printf("%d ", i);
}

このコードを実行すると、以下の出力が得られます。

1 2 3 4 6 7 8 9 10

特定の範囲内の値のみを出力

以下のコードは、1 から 10 までのうち、3 から 8 までの数字のみを出力します。

for (int i = 1; i <= 10; i++) {
  if (i >= 3 && i <= 8) {
    printf("%d ", i);
  }
}

このコードを実行すると、以下の出力が得られます。

3 4 5 6 7 8

ネストされたループにおける continue ステートメント

以下のコードは、2 つのネストされたループを使用して、2 から 9 までの偶数の積を出力します。 外側のループは i を 2 から 9 まで反復し、内側のループは j を 1 から i まで反復します。 内側のループで j が偶数の場合は、continue ステートメントを使用して次の i の値へと移行します。

int main() {
  int sum = 0;

  for (int i = 2; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
      if (j % 2 == 0) {
        continue;
      }
      sum += j;
    }
    printf("i = %d, sum = %d\n", i, sum);
    sum = 0;
  }

  return 0;
}

このコードを実行すると、以下の出力が得られます。

i = 2, sum = 2
i = 3, sum = 6
i = 4, sum = 12
i = 5, sum = 20
i = 6, sum = 30
i = 7, sum = 42
i = 8, sum = 56
i = 9, sum = 72

ラベル付き continue ステートメント

以下のコードは、3 つのループを使用して、1 から 100 までの数字を出力しますが、3 の倍数と 5 の倍数の場合はスキップします。 ラベル付き continue ステートメントを使用して、外側のループと内側のループを同時にスキップします。

#include <stdio.h>

int main() {
  for (int i = 1; i <= 100; i++) {
    outer:
      for (int j = 1; j <= 10; j++) {
        if (i % 3 == 0) {
          continue outer;
        }

        inner:
          for (int k = 1; k <= 5; k++) {
            if (i % 5 == 0) {
              continue inner;
            }
            printf("%d ", i);
          }
      }
  }

  return 0;
}

このコードを実行すると、3 と 5 の倍数を除いた 1 から 100 までの数字が出力されます。

説明

上記の例は、C言語における continue ステートメントの様々な使用方法を示しています。 continue ステートメントは、ループ処理をより柔軟に制御するのに役立つ便利なステートメントです。 状況に応じて適切に使用することで、より効率的で分かりやすいコードを書くことができます。



C言語における continue ステートメントの代替方法

別のループを使用する

場合によっては、別のループを使用して目的を達成することが可能です。 例えば、偶数のみを出力したい場合は、以下のコードのように 2 ずつカウントするループを使用することができます。

for (int i = 2; i <= 10; i += 2) {
  printf("%d ", i);
}

このコードは、continue ステートメントを使用するよりも簡潔で分かりやすいコードとなります。

条件分岐を使用する

if 文などの条件分岐を使用して、特定の条件を満たす場合のみ処理を実行することもできます。 例えば、特定の値を持つ要素をスキップしたい場合は、以下のコードのように if 文を使用することができます。

for (int i = 1; i <= 10; i++) {
  if (i == 5) {
    continue;
  }
  printf("%d ", i);
}

このコードは、continue ステートメントを使用するよりも冗長になりますが、より分かりやすいコードとなります。

goto 文を使用する

極端な方法として、goto 文を使用してループから直接別の場所へジャンプすることもできます。 ただし、goto 文はコードの可読性と保守性を著しく低下させるため、一般的には避けるべきです。

for (int i = 1; i <= 10; i++) {
  if (i == 5) {
    goto skip;
  }
  printf("%d ", i);
skip:
}

ループカウンタを変更することで、特定の処理をスキップすることもできます。 例えば、特定の範囲内の値のみを出力したい場合は、以下のコードのようにループカウンタを調整することができます。

for (int i = 3; i <= 8; i++) {
  printf("%d ", i);
}

このコードは、continue ステートメントを使用するよりも簡潔で分かりやすいコードとなります。

別の関数を使用する

場合によっては、別の関数を使用して処理を分割することで、continue ステートメントを使用せずに目的を達成することが可能です。 例えば、特定の条件を満たす要素のみを処理したい場合は、以下のコードのように条件に応じて処理を行う関数を作成することができます。

void process_element(int i) {
  if (i % 2 == 0) {
    printf("%d ", i);
  }
}

for (int i = 1; i <= 10; i++) {
  process_element(i);
}

このコードは、continue ステートメントを使用するよりもコードをモジュール化することができ、可読性と保守性を向上させることができます。

continue ステートメントは便利な機能ですが、状況によっては他の方法の方が適切な場合もあります。 上記で紹介した代替方法を参考に、それぞれの状況に応じて最適な方法を選択してください。