コンテンツにスキップ

C言語/while

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

while ループは C 言語の基本的な繰り返し構文の一つです。指定された条件が真である限り、処理を繰り返し実行します。条件判定が処理の前に行われるため、条件が最初から偽の場合は一度も処理が実行されない可能性があります。

構文

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

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

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

基本的な使用例

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

実行結果:

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

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

while ループの評価プロセス

[編集]
ステップ 動作
1 条件式を評価
2 条件式が真なら、ループ本体を実行
3 ループ本体の実行後、ステップ1に戻る
4 条件式が偽なら、ループを抜け出し次の文へ

for ループとの比較

[編集]

while ループと for ループは、同様の機能を提供しますが、構文と一般的な使用パターンが異なります:

特性 while ループ for ループ
初期化 ループ外で行う ループ宣言の一部
条件評価 ループの先頭
更新式 ループ本体内に記述 ループ宣言の一部
用途 終了条件が変数の値に基づく場合 固定回数のループや明確なカウンタがある場合

同等の for ループと while ループ

[編集]
#include <stdio.h>
int main() {
    printf("<code>[[../while|while]]</code> ループ: ");
    int i = 1;
    while (i <= 5) {
        printf("%d ", i);
        i++;
    }
    
    printf("\n<code>[[../for|for]]</code> ループ: ");
    for (int j = 1; j <= 5; j++) {
        printf("%d ", j);
    }
    
    return 0;
}

実行結果:

<code>[[../while|while]]</code> ループ: 1 2 3 4 5 
<code>[[../for|for]]</code> ループ: 1 2 3 4 5

実用例

[編集]

入力検証

[編集]
#include <stdio.h>
int main() {
    int number;
    int isValid = 0;
    
    while (!isValid) {
        printf("1から10までの数字を入力してください: ");
        scanf("%d", &number);
        
        if (number >= 1 && number <= 10) {
            isValid = 1;  // 有効な入力でループを終了
        } else {
            printf("無効な入力です。再度試してください。\n");
        }
    }
    
    printf("入力された有効な数字: %d\n", number);
    
    return 0;
}

ファイル処理

[編集]
#include <stdio.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    char line[100];
    
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line);  // ファイルから1行ずつ読み込んで表示
    }
    
    fclose(file);
    return 0;
}

連続した数の合計

[編集]
#include <stdio.h>
int main() {
    int sum = 0;
    int i = 1;
    
    while (i <= 100) {
        sum += i;
        i++;
    }
    
    printf("1から100までの合計: %d\n", sum);
    
    return 0;
}

while ループのネスト

[編集]

while ループは他のループと同様に入れ子にすることができます:

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

実行結果:

1,1	1,2	1,3	
2,1	2,2	2,3	
3,1	3,2	3,3

break と continue の使用

[編集]

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

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

実行結果:

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

無限ループとその制御

[編集]

while ループで無限ループを作成するには、条件式に 1 または true を指定します:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int secretNumber, guess, attempts = 0;
    int playing = 1;
    
    // 乱数の初期化
    srand(time(NULL));
    secretNumber = rand() % 100 + 1;  // 1〜100の乱数
    
    printf("1から100までの数字を当ててください!\n");
    
    while (1) {  // 無限ループ
        printf("予想を入力: ");
        scanf("%d", &guess);
        attempts++;
        
        if (guess < secretNumber) {
            printf("もっと大きい数字です\n");
        } else if (guess > secretNumber) {
            printf("もっと小さい数字です\n");
        } else {
            printf("正解! %d回で当てました!\n", attempts);
            break;  // 数字が当たったらループを抜ける
        }
    }
    
    return 0;
}

代表的な無限ループのパターン

[編集]
// 方法1: 常に真になる条件
while (1) {
    // ループ本体...
    if (終了条件) break;
}

// 方法2: 同等の別表現
while (true) {  // C23より前は <stdbool.h>のインクルードが必要
    // ループ本体...
    if (終了条件) break;
}

// 方法3: 変数を使用
int running = 1;
while (running) {
    // ループ本体...
    if (終了条件) running = 0;
}

while ループの実装時の注意点

[編集]

条件の初期化

[編集]

while ループを使用する前に、条件変数が適切に初期化されていることを確認することが重要です:

int i;  // 初期化されていない - 不定な動作

while (i < 10) {  // 危険: iの初期値は不定
    printf("%d\n", i);
    i++;
}

// 正しい実装:
int j = 0;  // 明示的に初期化
while (j < 10) {
    printf("%d\n", j);
    j++;
}

無限ループに注意

[編集]

ループ内で条件変数を更新し忘れると、無限ループが発生する可能性があります:

int i = 0;
while (i < 5) {
    printf("%d\n", i);
    // i++; が無い - 無限ループになる
}

// 正しい実装:
int j = 0;
while (j < 5) {
    printf("%d\n", j);
    j++;  // ループ終了に向けた更新
}

境界条件のテスト

[編集]

ループの境界条件(特に最初と最後の反復)をよく確認しましょう:

#include <stdio.h>
int main() {
    printf("境界条件の例:\n");
    
    // 0から始まるループ
    int i = 0;
    while (i < 3) {
        printf("i = %d\n", i);
        i++;
    }
    
    // 1から始まるループ
    printf("\n");
    int j = 1;
    while (j <= 3) {
        printf("j = %d\n", j);
        j++;
    }
    
    return 0;
}

実行結果:

境界条件の例:
i = 0
i = 1
i = 2

j = 1
j = 2
j = 3

効率的な while ループの使用法

[編集]

複合条件

[編集]

複数の条件を同時に評価できます:

while (条件1 && 条件2) {
    // 両方の条件が真の間、実行される
}

while (条件1 || 条件2) {
    // どちらかの条件が真の間、実行される
}

まとめ

[編集]

while ループは C 言語での反復処理を実装するための強力で柔軟なツールです。条件判定が先に行われる特性を理解し、適切な場面で使用することで、効率的で読みやすいコードを書くことができます。無限ループや条件変数の初期化、更新に注意しながら、様々な状況に応じて while ループを活用しましょう。