C言語の基本|回数ならfor、条件ならwhile

回数が見えるならfor、終わる条件が主役ならwhile。ループの目的に合わせて、意図が伝わる書き方を選ぼう。

for文とwhile文は、どちらも同じ処理を繰り返すための制御文です。書き方は異なりますが、ループを動かす基本的な仕組みは共通しています。

どちらのループにも、次の3つの要素があります。

  • 初期設定:繰り返しを始める前の準備
  • 継続条件:処理を続けるかどうかの判定
  • 再設定:次の繰り返しに向けた変数の更新

同じ繰り返し処理をfor文でもwhile文でも書ける場合はたくさんあります。違いは、処理が実行できるかどうかではなく、プログラムを読んだ人に何を強調して伝えるかです。

for文は、回数や数値の範囲を使った繰り返しを分かりやすく表現できます。while文は、条件が成り立っている間だけ続ける処理を自然に表現できます。

図1:for文とwhile文に共通するループの流れ

この図から分かること

for文とwhile文は、基本的に同じ順番で処理を進めます。

最初に初期設定を行い、継続条件を確認します。条件が真ならループ本体を実行し、再設定によって変数を更新してから条件判定へ戻ります。

継続条件が偽になるとループを終了します。この基本的な流れは、for文でもwhile文でも変わりません。

for文とwhile文の処理順序

for文とwhile文は、どちらも次の順番で動きます。

  1. 初期設定を行う
  2. 継続条件を評価する
  3. 条件が真ならループ本体を実行する
  4. 再設定で変数を更新する
  5. 継続条件の評価へ戻る
  6. 条件が偽になったらループを終了する

この処理順序をwhile文で表すと、次の形になります。

初期設定;

while (継続条件) {
    繰り返す処理;
    再設定;
}

同じ流れをfor文で表すと、次の形になります。

for (初期設定; 継続条件; 再設定) {
    繰り返す処理;
}

処理の流れは同じですが、3つの要素を書く場所が異なります。

while文では3つの要素を別々に書く

while文では、初期設定、継続条件、再設定をそれぞれ別の場所に記述します。

int count = 1;

while (count <= 4) {
    printf("%d回目\n", count);
    count++;
}
要素while文で書く場所この例での記述
初期設定while文の前count = 1
継続条件whileの丸括弧内count <= 4
再設定ループ本体の中count++

while文では、継続条件が目立つ位置にあります。そのため、いつ終わるかが状況によって変わるループを表現しやすくなります。

一方で、初期設定と再設定が離れているため、回数を管理するループでは3つの要素を探して読む必要があります。

for文では3つの要素を1行にまとめる

for文では、初期設定、継続条件、再設定を丸括弧内へまとめて記述します。

for (int count = 1; count <= 4; count++) {
    printf("%d回目\n", count);
}
要素for文で書く場所この例での記述
初期設定丸括弧内の1つ目int count = 1
継続条件丸括弧内の2つ目count <= 4
再設定丸括弧内の3つ目count++

for文の1行を見るだけで、次の情報を確認できます。

  • countは1から始まる
  • countが4以下の間は繰り返す
  • 1回ごとにcountを1増やす

このまとまりが、回数や範囲が決まっている繰り返しでfor文が読みやすい理由です。

while文で信号機を4台確認する

次のプログラムでは、while文を使って4台の信号機を順番に確認します。

while文で4台の信号機を順番に確認するプログラム

ファイル名:9_5_1.c

#include <stdio.h>

int main(void)
{
    int count = 1;

    while (count <= 4) {
        printf("%d台目の信号機を確認します。\n", count);
        count++;
    }

    return 0;
}
実行結果の例
1台目の信号機を確認します。
2台目の信号機を確認します。
3台目の信号機を確認します。
4台目の信号機を確認します。
プログラムの詳しい解説

最初に、カウンタ変数countを1で初期化しています。

int count = 1;

この部分がループの初期設定です。最初に確認する信号機を1台目とするため、開始値を1にしています。

while文の継続条件はcount <= 4です。

while (count <= 4)

countが4以下である間、ループ本体を繰り返します。

ループ本体では、現在のcountを信号機の番号として表示します。

printf("%d台目の信号機を確認します。\n", count);

表示後はcount++によってcountを1増やします。

count++;

各繰り返しでの値は、次のように変化します。

条件判定の時点count <= 4表示内容再設定後のcount
count = 11台目2
count = 22台目3
count = 33台目4
count = 44台目5
count = 5表示しない変更なし

countが5になるとcount <= 4が偽になるため、while文を終了します。

for文で信号機を4台確認する

同じ処理をfor文で記述すると、初期設定、継続条件、再設定を1行にまとめられます。

for文で4台の信号機を順番に確認するプログラム

ファイル名:9_5_2.c

#include <stdio.h>

int main(void)
{
    int count;

    for (count = 1; count <= 4; count++) {
        printf("%d台目の信号機を確認します。\n", count);
    }

    return 0;
}
実行結果の例
1台目の信号機を確認します。
2台目の信号機を確認します。
3台目の信号機を確認します。
4台目の信号機を確認します。
プログラムの詳しい解説

for文の丸括弧内は、セミコロンによって3つの部分に分かれています。

for (count = 1; count <= 4; count++)

それぞれの役割は次のとおりです。

count = 1

最初の部分は初期設定です。ループを始めるときに一度だけ実行されます。

count <= 4

2つ目は継続条件です。ループ本体へ入る前に評価され、真なら処理を続けます。

count++

3つ目は再設定です。ループ本体を1回実行するたびにcountを1増やします。

for文では、countの開始値、終了条件、変化のしかたが同じ行に並んでいます。そのため、4回繰り返すループであることを把握しやすくなっています。

図2:while文とfor文で3要素を書く場所の違い

この図から分かること

while文では、初期設定、継続条件、再設定が別々の場所に書かれています。継続条件が中心に見えるため、条件によって終了するループに向いています。

for文では3つの要素が1行にまとまっています。どこから始まり、いつまで続き、どのように変化するのかをまとめて確認できます。

同じ出力でも伝わる意図が違う

9_5_1.cと9_5_2.cは、どちらも同じ結果を表示します。

比較する点while版for版
開始値count = 1count = 1
継続条件count <= 4count <= 4
再設定count++count++
ループ回数4回4回
実行結果同じ同じ

実行結果だけを見ると違いはありません。

ただし、for文を見た読み手は、回数を管理するカウンタループだとすぐに判断できます。while文では、条件が中心となるループであることが強調されます。

どちらを使っても正しく動く場合は、処理の目的が伝わりやすいほうを選びましょう。

回数や範囲が決まっているならfor文

繰り返す回数や数値の範囲が、ループを始める時点で分かっている場合はfor文が向いています。

たとえば、次のような処理です。

  • 同じメッセージを5回表示する
  • 1から100までの整数を順番に処理する
  • 配列の先頭から末尾まで確認する
  • 10個のセンサー値を合計する
  • 0から9までの番号を表示する

for文では、ループの範囲を1行にまとめて示せます。

for (count = 1; count <= 5; count++) {
    繰り返す処理;
}

この1行から、1から5まで1ずつ増やすことが読み取れます。

終了条件が状況によって決まるならwhile文

何回繰り返すかを事前に決められず、実行中の状態によって終了する場合はwhile文が向いています。

たとえば、次のような処理です。

  • 0が入力されるまで入力を続ける
  • 正しい値が入力されるまで再入力する
  • 荷物が残っている間、搬送を続ける
  • センサーが異常を示している間、確認を続ける
  • ファイルの終わりまでデータを読み込む

while文では、終了を判断する条件が目立ちます。

while (input != 0) {
    繰り返す処理;
}

このコードからは、inputが0ではない間、繰り返すという意図がすぐに分かります。

for文でも条件中心のループは書ける

for文の3つの式は、それぞれ省略できます。そのため、条件だけを残した書き方も可能です。

for (; input != 0; ) {
    繰り返す処理;
}

この書き方はwhile文と同じように動かせますが、初期設定と再設定がないfor文は少し不自然に見えることがあります。

終了条件が主役なら、次のwhile文のほうが目的を伝えやすいでしょう。

while (input != 0) {
    繰り返す処理;
}

書けるかどうかだけではなく、コードを見たときに意図をすぐ理解できるかが大切です。

while文でも回数指定のループは書ける

回数が決まっている処理をwhile文で書くこともできます。

count = 1;

while (count <= 5) {
    繰り返す処理;
    count++;
}

正しく動作しますが、初期設定と再設定が離れています。

再設定のcount++を書き忘れると、countが変化せず、ループが終了しません。for文なら、count++がループの見出し部分にあるため、カウンタの更新を確認しやすくなります。

for文とwhile文の使い分け早見表

目的や状況おすすめ理由
決まった回数だけ繰り返すfor回数を1行で確認できる
1からNまで処理するfor開始値と終了条件が明確
配列を順番に処理するforインデックスの変化をまとめて書ける
0が入力されるまで続けるwhile終了条件をそのまま表現できる
正しい入力まで繰り返すwhile回数を事前に決められない
状態が変わるまで待つwhile状態条件がループの中心になる
どちらでも自然に書ける読みやすいほう意図が伝わることを優先する

選択するときはループの主役を考える

for文とwhile文のどちらを使うか迷ったら、ループで何を一番見せたいかを考えてみましょう。

回数や範囲が主役なら、次の情報を1行で見せられるfor文が向いています。

  • どこから始めるか
  • どこまで続けるか
  • 1回ごとにどう変化するか

終了条件が主役なら、while文が向いています。

  • 入力が特定の値になるまで
  • データが残っている間
  • 条件を満たすまで
  • 状態が変化するまで

図3:for文とwhile文を選ぶ判断の流れ

この図から分かること

回数や範囲が最初から分かっている場合は、for文を選ぶとループの全体像を1行で表せます。

回数が分からず、入力値や状態の変化によって終了する場合は、while文を選ぶと継続条件が分かりやすくなります。

迷ったときの決め方

for文とwhile文で迷ったときは、次の順番で考えると選びやすくなります。

  1. 繰り返す回数が最初から決まっているか確認する
  2. 開始値と終了値をカウンタで表せるか確認する
  3. 回数や範囲が明確ならfor文を選ぶ
  4. 終了が入力値や状態に左右されるならwhile文を選ぶ
  5. どちらでも自然に書けるなら、処理の意図が読み取りやすいほうを選ぶ

for文とwhile文は、どちらか一方だけが正しいという関係ではありません。同じ処理を実現できる場合でも、ループの目的に合った構文を選ぶことで、後からコードを読む人が処理を理解しやすくなります。