
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 | 処理後 points | count |
|---|---|---|---|---|
| 1 | 35 | 真 | 25 | 1 |
| 2 | 25 | 真 | 15 | 2 |
| 3 | 15 | 真 | 5 | 3 |
| 4 | 5 | 偽 | - | - |
この表を見れば、「いつ終わるか」が一発で分かります。
while文はこうやって 値を更新しながら条件を満たす間だけ回る のが基本の形です。
ここで登場した命令(関係する要素)の役割
while(繰り返し制御)
| 書式 | 何をする? |
|---|---|
| while (式) 文 | 式が真の間、文を繰り返す |
| while (式) { ... } | 式が真の間、ブロック内を繰り返す |
複合代入演算子 -=(更新を短く書く)
サンプルでは points -= 10; を使っています。
| 書式 | ほぼ同じ意味 | 何をする? |
|---|---|---|
| a -= b | a = a - b | a を b 減らす |
インクリメント ++(カウンタ更新)
count++; は count を 1 増やします。
| 書式 | ほぼ同じ意味 | 何をする? |
|---|---|---|
| a++ | a = a + 1 | a を 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回は必ず実行したいかどうか」で決める。
