第7回 | C言語のwhile文と反復処理を学ぶ:条件が成り立つ間くり返す| UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第7回|C言語のwhile文と反復処理を学ぶ:条件が成り立つ間くり返す

はじめてのC言語 | 第7回

目次

はじめに

前回は、for 文を使って回数を決めた繰り返し処理を学びました。今回は、条件が成り立つ間だけ処理を繰り返す while 文 を扱います。

繰り返し処理というと、決まった回数だけ同じことをするイメージがあるかもしれません。でも、while 文を使うと、「体力が残っている間だけ探索する」「条件を満たす間だけ処理を続ける」といった、少しゲームに近い動きを作れます。

プログラムは、条件が変わることで動きが変わります。どの条件なら続くのか、どのタイミングで止まるのかを自分で決められるところが、while 文のおもしろいところです。

この回の目的は次の6点です。

  • while 文の基本形を理解する
  • 条件によって繰り返しを止める方法を知る
  • break でループを途中で抜ける方法を知る
  • カウンタ変数を使った反復処理を書けるようにする
  • 無限ループを避けるための基本を押さえる
  • while 文で、簡単な探索パズルを作る

while 文とは何か

while 文は、条件式が真である間、同じ処理を繰り返す構文です。

基本形は次のとおりです。

while (条件式) {
    繰り返す処理;
}

意味は次のとおりです。

  • 条件式が真なら処理を実行する
  • 処理のあとで再び条件式を判定する
  • 条件式が偽になったら繰り返しを終了する

最初のサンプルコード

ソースコード

while_sample.c という名前で保存します。

#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 5) {
        printf("%d\n", i);
        i++;
    }

    return 0;
}

実行手順

1. 作業ディレクトリに移動する

cd ~/Desktop

2. コンパイルする

clang while_sample.c -o while_sample

3. 実行する

./while_sample

実行結果:

1
2
3
4
5

コードの読み方

int i = 1;

繰り返し回数を管理する変数 i を宣言し、1 を代入しています。

while (i <= 5)

i が 5 以下である間、波かっこの中を繰り返します。

printf("%d\n", i);

現在の i の値を表示します。

i++;

1回の処理が終わるたびに i を1増やします。
これにより、いつか i <= 5 が偽になり、ループが終了します。

while 文の処理の流れ

次のコードを例にします。

int i = 1;

while (i <= 3) {
    printf("%d\n", i);
    i++;
}

処理の流れは次のとおりです。

  1. i に 1 を入れる
  2. i <= 3 を判定する
  3. 真なら中の処理を実行する
  4. i++i を増やす
  5. 再び条件式を判定する
  6. 偽になるまで繰り返す

for 文との違い

for 文と while 文は、どちらも繰り返し処理に使います。

for 文が向いている場面

  • 何回繰り返すかが最初から分かっている
  • カウンタを1ずつ増減させる

例:

for (i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

while 文が向いている場面

  • 条件が満たされている間だけ繰り返したい
  • 終了回数が最初から決まっていない

この段階では、回数が明確なら for、条件ベースなら while と考えておけば十分です。

0から始める例

#include <stdio.h>

int main(void) {
    int i = 0;

    while (i < 5) {
        printf("%d\n", i);
        i++;
    }

    return 0;
}

実行結果:

0
1
2
3
4

i < 5 なので、5 は表示されません。

if 文と組み合わせる例

while 文の中でも条件分岐を使えます。

#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 10) {
        if (i % 2 == 0) {
            printf("%d\n", i);
        }
        i++;
    }

    return 0;
}

実行結果:

2
4
6
8
10

break でループを途中で抜ける

while 文は、条件式が真である間は処理を繰り返します。けれども、ループの途中で特定の条件になったら、そこで繰り返しを終わらせたいこともあります。

そのようなときに使うのが break 文です。break を実行すると、while 文の条件式がまだ真でも、その場でループを抜けます。

#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 10) {
        printf("%d\n", i);

        if (i == 5) {
            break;
        }

        i++;
    }

    printf("loop end\n");

    return 0;
}

実行結果:

1
2
3
4
5
loop end

この例では、while (i <= 10) なので、本来は 10 まで繰り返せます。しかし、i が 5 になったところで break が実行されるため、ループはそこで終了します。

break は、「回数や値で自然に終わる」というよりも、「途中で特定の出来事が起きたらやめる」場合に使います。たとえば、目的の値が見つかった、入力が終了された、これ以上処理する必要がなくなった、といった場面です。

while で遊んでみる:体力がなくなるまで探索しよう

ここまでの例では、数字を順番に表示してきました。次は、while 文を使って、体力が残っている間だけ探索を続ける小さなプログラムを書いてみます。

最初の体力を入力で決めて、1回探索するたびに体力を 1 減らします。体力が 0 になると、while 文の条件が偽になり、探索が終了します。

#include <stdio.h>

int main(void) {
    int hp;

    printf("冒険に出る準備をします。\n");
    printf("初期HPを数字で入力してください:");
    scanf("%d", &hp);

    printf("--- 冒険開始! ---\n");

    while (hp > 0) {
        printf("探索中... 現在のHP = %d\n", hp);
        hp--;
    }

    printf("--- 冒険終了!HPが尽きました ---\n");

    return 0;
}

ここでは while 文の動きを見やすくするため、scanf の入力エラー処理は省略しています。

実行結果:

冒険に出る準備をします。
初期HPを数字で入力してください:10
--- 冒険開始! ---
探索中... 現在のHP = 10
探索中... 現在のHP = 9
探索中... 現在のHP = 8
探索中... 現在のHP = 7
探索中... 現在のHP = 6
探索中... 現在のHP = 5
探索中... 現在のHP = 4
探索中... 現在のHP = 3
探索中... 現在のHP = 2
探索中... 現在のHP = 1
--- 冒険終了!HPが尽きました ---

ポイントは、次の条件です。

while (hp > 0)

これは「hp が 0 より大きい間は繰り返す」という意味です。この実行例では hp に 10 を入力しているため、最初の条件は真です。処理の中で hp--; が実行されるたびに hp が 1 ずつ減り、最後に hp が 0 になると条件が偽になります。

while 文では、このように「続ける条件」と「条件を変化させる処理」をセットで考えることが大切です。

自分で改造してみよう

サンプルが動いたら、少しだけ値や条件を変えてみましょう。

  • 入力するHPを 5 や 10 に変えると、探索回数はどう変わるか
  • while (hp > 0)while (hp > 2) に変えると、どこで探索が止まるか
  • hp--; を消すと、なぜ終わらなくなるのか実行前に考えてみる
  • 表示する文字列を変えて、自分なりの探索メッセージにしてみる

最初から難しいプログラムを作る必要はありません。値を変えて、条件を変えて、結果を見る。この小さな実験を繰り返すと、while 文が「条件が続く間だけ動く」仕組みだと分かりやすくなります。

無限ループに注意する

while 文では、条件式を偽にする処理を書き忘れると、ループが止まらなくなります。

もし無限ループになった場合は、キーボードの Ctrl+c でループから脱出できます。

誤った例:

#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 5) {
        printf("%d\n", i);
    }

    return 0;
}

このコードでは i が変化しないため、i <= 5 がずっと真のままです。
結果として、無限ループになります。

正しくは、次のように i++ が必要です。

#include <stdio.h>

int main(void) {
     int i = 1;

     while (i <= 5) {
         printf("%d\n", i);
         i++;
     }

     return 0;
}

初心者がつまずきやすい点

条件式の変化を忘れない

while 文では、条件が変わる仕組みを自分で書く必要があります。
この更新がないと終了しません。

=== を混同しない

比較には == を使います。

比較を条件の中で使う例:

while (i <= 5) {
    if (i == 3) {
        printf("3です\n");
    }

    i++;
}

波かっこを省略しない

1行でも波かっこは書く方が安全です。

while (i <= 5) {
    printf("%d\n", i);
    i++;
}

よくあるエラー

expected expression

原因: while () の丸かっこの中が空です。
対処: 条件式を書く必要があります。

use of undeclared identifier

原因: 変数を宣言する前に使っています。
対処: 先に int i = 1; のように宣言します。

終わらない実行になる

原因: 更新処理がない、または条件式が常に真です。
対処: 条件がいつ偽になるかを確認します。

練習用コード

1から5まで表示する

#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 5) {
        printf("%d\n", i);
        i++;
    }

    return 0;
}

実行結果:

1
2
3
4
5

3回だけ文字列を表示する

#include <stdio.h>

int main(void) {
    int count = 0;

    while (count < 3) {
        printf("Hello\n");
        count++;
    }

    return 0;
}

実行結果:

Hello
Hello
Hello

まとめ

今回のポイントは次のとおりです。

  • while 文は、条件が真である間だけ処理を繰り返す
  • 条件式を偽にする更新処理が必要である
  • for 文と同様に、カウンタ変数を使って反復処理を書ける
  • 体力などの値を変化させると、条件が偽になったところで処理を止められる
  • break を使うと、条件式とは別にループを途中で終了できる
  • 無限ループを避けるには、条件の変化を必ず意識する
  • 実行中に無限ループになった場合は、ターミナルで Ctrl+c を実行して停止できる

この回では、while 文を使った繰り返し処理を確認しました。
for 文と while 文の両方を理解すると、基本的な反復処理はひと通り書けるようになります。条件を少し変えるだけで、プログラムの続き方や止まり方も変わります。

次回予告

次のステップでは、関数という考え方を学びます。
関数は、処理をひとまとめにして、必要なときに呼び出せる仕組みです。

同じ処理を何度も書かずに済むようになることで、コードはぐっと読みやすくなります。
少しずつ、プログラム全体を整理して書けるようになっていきます。

復習してみよう

復習したい方は、こちらもあわせてご覧ください。

C言語の次にUnityやUnreal Engineを学ぶ選択肢

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次