C言語基礎|while文による繰り返し処理

はじめに:while文は「条件を満たす間だけ繰り返す」門番タイプ

前に学んだ do文は「とにかく1回やってから判定」でしたよね。
一方で while文 は、もっと慎重派です。

  • 先に条件をチェック
  • 条件がOKなら実行
  • ダメなら最初から実行しない

つまり while文は、ループの入口にいる“門番”みたいな存在です。
「条件を満たしている間だけ処理したい」「最初から条件がダメなら何もしないで終わりたい」
そんなときに、while文がすごくしっくりきます。

サンプル:ポイント残高を減らしながら利用回数を表示

「ポイント残高を入力し、10ポイントずつ使える回数を表示しながら残高を減らす」プログラムを例に解説します。

プロジェクト名:chap4-6-1 ソースファイル名:chap4-6-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// ポイント残高から、10ポイント単位で何回使えるかを表示する
#include <stdio.h>

int main(void)
{
    int points;
    int count = 0;

    printf("ポイント残高を入力してください:");
    scanf("%d", &points);

    while (points >= 10) {
        printf("利用%d回目:残りポイントは%dです。\n", count + 1, points);
        points -= 10;
        count++;
    }

    printf("これ以上は利用できません。最終残高は%dポイントです。\n", points);
    return 0;
}

実行例

ポイント残高を入力してください:35
利用1回目:残りポイントは35です。
利用2回目:残りポイントは25です。
利用3回目:残りポイントは15です。
これ以上は利用できません。最終残高は5ポイントです。
  • 35 なら 10ポイント利用が3回できて、残りは 5
  • もし 8 を入力したら、whileの条件が最初から偽なので、ループ本体は1回も実行されません

while文の書式(構文)と意味

while文の基本形はこれです。

while文の書式

要素書き方役割
キーワードwhileループ開始を示す
制御式(式)真(非0)なら繰り返す条件
ループ本体文 または 複合文繰り返し実行する処理

while文の構文

while (式)
    文

複数の文を繰り返したいときは、ブロック(複合文)にします。

while (式) {
    文1;
    文2;
}

do文との違い:判定が「前」か「後」か

ここがこの節の超重要ポイントです。

do文とwhile文の違い

条件を判定するタイミング特徴
do文ループ本体の実行後必ず1回は実行される。
while文ループ本体の実行前条件が偽なら1回も実行されない。

今回のポイント例でいうと、

  • points が 10 未満なら「最初から使えない」
  • だから while文が自然

という感じです。

while文のプログラムの流れ

while文は、毎回こういう順番で動きます。

図:while文の制御フロー

(1) 式を評価
     ↓
 真(非0)なら (2)へ
 偽(0)なら ループ終了
     ↓
(2) ループ本体を実行
     ↓
(1) に戻る

この「先に式を評価する」仕組みがあるから、
条件がダメなら素通り が実現できます。

サンプルの制御式を読み解く:継続条件は points >= 10

今回の制御式はこれです。

points >= 10

この式の意味は、

  • ポイントが 10 以上ある間は繰り返す。

です。

ループの中で毎回

  • points を 10 減らす
  • count を 1 増やす

ので、いずれ points は 10 未満になって、whileが終了します。

ループ本体で値がどう変わる?(表で追跡)

35ポイントから始めた場合を追ってみます。

表:繰り返しごとの変化

繰り返し回数ループ開始時 points条件 points >= 10処理後 pointscount
135251
225152
31553
45--

この表を見れば、「いつ終わるか」が一発で分かります。
while文はこうやって 値を更新しながら条件を満たす間だけ回る のが基本の形です。

ここで登場した命令(関係する要素)の役割

while(繰り返し制御)

書式何をする?
while (式) 文式が真の間、文を繰り返す
while (式) { ... }式が真の間、ブロック内を繰り返す

複合代入演算子 -=(更新を短く書く)

サンプルでは points -= 10; を使っています。

書式ほぼ同じ意味何をする?
a -= ba = a - ba を b 減らす

インクリメント ++(カウンタ更新)

count++; は count を 1 増やします。

書式ほぼ同じ意味何をする?
a++a = a + 1a を 1 増やす

演習問題

演習4-3:ポイントが 0 未満なら何も表示せず終了するようにせよ

上のサンプルでは、ポイントが負でも最後のメッセージが出ます。
ポイントが 0 未満なら、何も表示せずに終了するように書きかえてください。

解答例

プロジェクト名:chap4-6-2 ソースファイル名:chap4-6-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int points;
    int count = 0;

    printf("ポイント残高を入力してください:");
    scanf("%d", &points);

    if (points < 0) {
        return 0;   // 負なら何も表示せず終了
    }

    while (points >= 10) {
        printf("利用%d回目:残りポイントは%dです。\n", count + 1, points);
        points -= 10;
        count++;
    }

    printf("これ以上は利用できません。最終残高は%dポイントです。\n", points);
    return 0;
}

まとめ:while文は「最初にチェック、OKなら繰り返す」

  • while文は 条件を先に評価する
  • 条件が偽なら ループ本体は1回も実行されない
  • ループ内で値を更新して、いつか条件が偽になるように設計する。
  • do文との使い分けは「1回は必ず実行したいかどうか」で決める。