コンテンツにスキップ

C言語/continue

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

continue ステートメントは、C言語のループ制御構文の一つで、現在実行中のループ反復を途中で終了し、次の反復へ制御を移します。これにより、特定の条件下でループ本体の残りの処理をスキップしつつ、ループ自体は継続することができます。

構文と基本的な使い方

[編集]
continue;

continue ステートメントがループ内で実行されると、以下の動作が発生します:

#include <stdio.h>
int main() {
    int i;
    
    for (i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue; // 偶数の場合は以降の処理をスキップ
        }
        
        printf("%d ", i); // 奇数のみ表示される
    }
    
    return 0;
}

実行結果:

1 3 5 7 9

このコードでは、偶数の場合に continue が実行され、printf() 文がスキップされます。

continue と各種ループの動作

[編集]

continue ステートメントは forwhiledo-while の各ループで異なる動作をします。

ループの種類 continue 後の動作
for 更新式(i++など)が実行され、条件判定へ進む
while 直接条件判定へ戻る
do-while 直接条件判定へ戻る

for ループでの continue

[編集]
#include <stdio.h>
int main() {
    printf("for ループでの continue:\n");
    
    for (int i = 0; i < 5; i++) {
        printf("ループ開始 i = %d\n", i);
        
        if (i == 2) {
            printf("  continue 実行\n");
            continue;
        }
        
        printf("  ループ本体実行 i = %d\n", i);
    }
    
    return 0;
}

実行結果:

for ループでの continue:
ループ開始 i = 0
  ループ本体実行 i = 0
ループ開始 i = 1
  ループ本体実行 i = 1
ループ開始 i = 2
  continue 実行
ループ開始 i = 3
  ループ本体実行 i = 3
ループ開始 i = 4
  ループ本体実行 i = 4

while ループでの continue

[編集]
#include <stdio.h>
int main() {
    printf("while ループでの continue:\n");
    
    int i = 0;
    while (i < 5) {
        printf("ループ開始 i = %d\n", i);
        
        if (i == 2) {
            printf("  continue 実行\n");
            i++; // continue の前にカウンタを更新する必要がある
            continue;
        }
        
        printf("  ループ本体実行 i = %d\n", i);
        i++;
    }
    
    return 0;
}

実行結果:

while ループでの continue:
ループ開始 i = 0
  ループ本体実行 i = 0
ループ開始 i = 1
  ループ本体実行 i = 1
ループ開始 i = 2
  continue 実行
ループ開始 i = 3
  ループ本体実行 i = 3
ループ開始 i = 4
  ループ本体実行 i = 4

実用例:データ処理でのスキップ

[編集]
#include <stdio.h>
int main() {
    // 成績データ(0は欠席や未提出を表す)
    int scores[] = {85, 0, 92, 78, 0, 90, 88, 0};
    int count = sizeof(scores) / sizeof(scores[0]);
    
    int sum = 0;
    int valid_count = 0;
    
    printf("有効な成績データ: ");
    
    for (int i = 0; i < count; i++) {
        if (scores[i] == 0) {
            continue; // 無効なデータはスキップ
        }
        
        printf("%d ", scores[i]);
        sum += scores[i];
        valid_count++;
    }
    
    if (valid_count > 0) {
        float average = (float)sum / valid_count;
        printf("\n平均点: %.2f (有効データ数: %d)\n", average, valid_count);
    }
    
    return 0;
}

実行結果:

有効な成績データ: 85 92 78 90 88 
平均点: 86.60 (有効データ数: 5)

ネストしたループでの continue

[編集]

continue は現在実行中の最も内側のループにのみ影響します。

#include <stdio.h>
int main() {
    printf("ネストしたループでの continue:\n");
    
    for (int i = 0; i < 3; i++) {
        printf("外側ループ: i = %d\n", i);
        
        for (int j = 0; j < 4; j++) {
            if (j == 1) {
                printf("  内側で continue (j = %d)\n", j);
                continue; // 内側ループの現在の反復のみスキップ
            }
            
            printf("  内側ループ: j = %d\n", j);
        }
        
        printf("外側ループの終わり\n\n");
    }
    
    return 0;
}

注意点と良い使い方

[編集]

無限ループでの注意

[編集]

whiledo-while ループで continue を使用する場合、カウンタの更新や終了条件の変更を continue の前に行う必要があります。

#include <stdio.h>
int main() {
    int i = 0;
    
    while (i < 5) {
        if (i == 2) {
            i++; // continueの前にカウンタを更新
            continue;
        }
        
        printf("%d ", i);
        i++;
    }
    
    return 0;
}

continue と if-else の比較

[編集]

継続条件と処理条件が明確に分かれる場合、continue を使うとコードの可読性が向上することがあります。

// continue を使った場合
for (int i = 0; i < n; i++) {
    if (条件1) continue;
    if (条件2) continue;
    
    // 残りの処理(条件1も条件2も満たさない場合のみ実行)
    処理A;
    処理B;
    処理C;
}

// if-else を使った同等のコード
for (int i = 0; i < n; i++) {
    if (!条件1 && !条件2) {
        処理A;
        処理B;
        処理C;
    }
}

まとめ

[編集]

continue ステートメントは、特定の条件下でループの現在の反復をスキップするための強力なツールです。適切に使用することで、コードの可読性や効率を向上させることができます。ただし、過度に使用するとプログラムのフローが複雑になる可能性があるため、明確な目的がある場合に限って使用することをお勧めします。