コンテンツにスキップ

C言語/do

出典: フリー教科書『ウィキブックス(Wikibooks)』
C言語/do-while から転送)

概要

[編集]

do-while ループは C 言語の繰り返し構文の一つで、処理を最低1回実行した後に条件を評価し、その条件が真である限り処理を繰り返します。他のループ構文とは異なり、条件判定が処理の後に行われるため、最初の実行は無条件に行われます。

構文

[編集]
do {
    /* 実行する文 */
} while (条件式);

do-while ループは以下の順序で実行されます:

  1. 波括弧 {} で囲まれた文(ループ本体)を実行する
  2. 条件式を評価する
  3. 条件式が真(ゼロ以外)なら1に戻る、偽(ゼロ)なら次の文へ進む

基本的な使用例

[編集]
#include <stdio.h>
int main() {
    int count = 1;
    
    do {
        printf("%d ", count);
        count++;
    } while (count <= 5);
    
    printf("\nループ終了後: count = %d\n", count);
    
    return 0;
}

実行結果:

1 2 3 4 5 
ループ終了後: count = 6

このコードでは、count の値を表示してからインクリメントし、count が 5 以下である限りループを続けます。

while ループとの比較

[編集]

do-while ループと while ループの主な違いは、条件判定のタイミングです。以下にその違いを示します:

特性 do-while ループ while ループ
条件の評価タイミング ループ本体の実行後 ループ本体の実行前
最小実行回数 1回 0回
構文 do { 処理 } while (条件); while (条件) { 処理 }

同じ処理を行う do-while と while の比較

[編集]
#include <stdio.h>
int main() {
    int i = 1;
    
    printf("do-whileループ: ");
    do {
        printf("%d ", i);
        i++;
    } while (i <= 5);
    
    printf("\n");
    
    i = 1; // カウンタをリセット
    
    printf("whileループ: ");
    while (i <= 5) {
        printf("%d ", i);
        i++;
    }
    
    return 0;
}

実行結果:

do-whileループ: 1 2 3 4 5 
whileループ: 1 2 3 4 5

この場合、両方のループは同じ結果を生成します。しかし、初期条件が既に偽である場合は結果が異なります:

#include <stdio.h>
int main() {
    int i = 10;
    
    printf("do-whileループ: ");
    do {
        printf("%d ", i);
        i++;
    } while (i <= 5);
    
    printf("\n");
    
    i = 10; // カウンタをリセット
    
    printf("whileループ: ");
    while (i <= 5) {
        printf("%d ", i);
        i++;
    }
    
    return 0;
}

実行結果:

do-whileループ: 10 
whileループ:

do-while ループでは条件に関わらず本体が1回実行されますが、while ループでは条件が最初から偽であれば本体は実行されません。

実用例

[編集]

ユーザー入力の検証

[編集]

do-while ループは、ユーザーからの入力を検証する場合に特に便利です:

#include <stdio.h>
int main() {
    int number;
    
    do {
        printf("1から10までの数字を入力してください: ");
        scanf("%d", &number);
        
        if (number < 1 || number > 10) {
            printf("無効な数字です。再入力してください。\n");
        }
    } while (number < 1 || number > 10);
    
    printf("入力された有効な数字: %d\n", number);
    
    return 0;
}

このプログラムは、ユーザーが1から10までの有効な数字を入力するまで入力を促し続けます。

メニュー駆動システム

[編集]
#include <stdio.h>
int main() {
    int choice;
    
    do {
        printf("\nメニュー:\n");
        printf("1. 新規ファイル\n");
        printf("2. ファイルを開く\n");
        printf("3. ファイルを保存\n");
        printf("4. 終了\n");
        printf("選択してください (1-4): ");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("新規ファイルを作成しました。\n");
                break;
            case 2:
                printf("ファイルを開きました。\n");
                break;
            case 3:
                printf("ファイルを保存しました。\n");
                break;
            case 4:
                printf("プログラムを終了します。\n");
                break;
            default:
                printf("無効な選択です。再度選択してください。\n");
        }
    } while (choice != 4);
    
    return 0;
}

このプログラムは、ユーザーが「終了」オプションを選択するまでメニューを表示し続けます。

do-while ループのネスト

[編集]

他のループと同様に、do-while ループも入れ子にして使用できます:

#include <stdio.h>
int main() {
    int i = 1;
    
    do {
        int j = 1;
        
        do {
            printf("%d,%d\t", i, j);
            j++;
        } while (j <= i);
        
        printf("\n");
        i++;
    } while (i <= 5);
    
    return 0;
}

実行結果:

1,1	
2,1	2,2	
3,1	3,2	3,3	
4,1	4,2	4,3	4,4	
5,1	5,2	5,3	5,4	5,5

このプログラムは、三角形のパターンを出力します。

break と continue の使用

[編集]

do-while ループ内でも breakcontinue ステートメントを使用してループの制御ができます:

#include <stdio.h>
int main() {
    int i = 0;
    
    do {
        i++;
        
        if (i == 3) {
            printf("iが3の時はスキップします\n");
            continue; // 現在の反復をスキップして次の反復へ
        }
        
        if (i == 7) {
            printf("iが7になったのでループを終了します\n");
            break; // ループを完全に終了
        }
        
        printf("i = %d\n", i);
    } while (i < 10);
    
    printf("最終的な i の値: %d\n", i);
    
    return 0;
}

実行結果:

i = 1
i = 2
iが3の時はスキップします
i = 4
i = 5
i = 6
iが7になったのでループを終了します
最終的な i の値: 7

do-while の注意点

[編集]

セミコロンの忘れ

[編集]

do-while ループは、while の後にセミコロンが必要です。これを忘れるとコンパイルエラーが発生します:

// 誤った使用法
do {
    処理
} while (条件)  // セミコロンがない - エラー

// 正しい使用法
do {
    処理
} while (条件);  // セミコロンがある

無限ループ

[編集]

do-while ループで無限ループを作成する場合は、条件式に 1 または true を使用します:

do {
    printf("無限ループ\n");
    
    // ループを抜け出す条件
    if (特定条件) {
        break;
    }
} while (1);

まとめ

[編集]

do-while ループは、処理を最低1回実行する必要がある状況で特に役立ちます。ユーザー入力の検証やメニュー駆動システムなど、処理が少なくとも1回は実行されるべきシナリオに最適です。条件判定が処理の後に行われるという特性を理解し、適切な場面で使用することで、効率的で読みやすいコードを書くことができます。