6日でできる 新C言語入門|while文とdo~while文の違い

条件を先に見るか、まず1回動かすか。
while文とdo〜while文の違いを理解して、繰り返し処理を正しく使い分けよう。

C言語には、同じ処理を繰り返すための構文がいくつかあります。代表的なものには、for文、while文、do〜while文があります。

for文は、繰り返す回数がある程度はっきりしている場合に使いやすい構文です。たとえば、1から10まで表示する、配列の要素を順番に処理する、といった場面でよく使われます。

一方、while文とdo〜while文は、繰り返す回数が最初から決まっていない場合や、条件によって繰り返し回数が変わる場合に使いやすい構文です。たとえば、入力された値が条件を満たしている間だけ処理を続ける、終了番号が入力されるまで繰り返す、メニューを最低1回は表示するといった場面で役立ちます。

while文とdo〜while文は、どちらも条件式を使って繰り返しを制御します。しかし、大きな違いがあります。それは、条件を判定するタイミングです。

while文は、処理を実行する前に条件式を判定します。そのため、条件が最初から成り立たない場合は、処理が1回も実行されないことがあります。

do〜while文は、先に処理を実行してから条件式を判定します。そのため、条件が最初から成り立たない場合でも、処理は必ず1回実行されます。

この違いを理解しておくと、入力処理、メニュー処理、カウント処理、終了条件付きの繰り返しなどを、目的に合わせて正しく書けるようになります。この記事では、while文とdo〜while文の基本構造、動きの違い、サンプルプログラム、注意点、使い分けの考え方をやさしく解説していきます。

while文は条件を先に判定する

while文は、条件式が成り立っている間だけ処理を繰り返す構文です。基本の形は次のようになります。

while (条件式) {
    繰り返したい処理
}

while文では、最初に条件式を判定します。条件式が真であれば、中括弧の中の処理を実行します。処理が終わると、再び条件式を判定し、条件式が真である間は繰り返し続けます。

条件式が偽になった時点で、while文を抜けて次の処理へ進みます。

項目内容
条件判定のタイミング処理の前
最低1回の実行条件が偽なら実行されない
向いている処理条件を満たす場合だけ繰り返したい処理
注意点条件に使う変数を更新しないと無限ループになることがある

while文は、処理を始める前に条件を確認したい場合に向いています。たとえば、在庫がある間だけ処理する、入力値が有効な間だけ処理する、カウンタが範囲内の間だけ表示するといった使い方ができます。

図:while文は処理の前に条件を確認する

この図から分かること

この図から分かるのは、while文では処理を実行する前に条件式を確認するという点です。

条件式が真なら処理を実行し、処理が終わると再び条件式へ戻ります。条件式が偽になった時点でループを終了します。最初の判定で条件式が偽だった場合は、中括弧の中の処理は1回も実行されません。

while文のサンプルプログラム

次のプログラムでは、while文を使って1から5までの数値を表示します。

プロジェクト/ファイル名: Lesson28_1/main.c

#include <stdio.h>

int main(void) {
    int count = 1;

    // countが5以下の間、数値を表示する
    while (count <= 5) {
        printf("%d ", count);

        // countを1増やして、次の判定へ進む
        count++;
    }

    printf("\n");

    return 0;
}

実行結果

1 2 3 4 5

このプログラムでは、最初にcountへ1を代入しています。その後、while文でcount <= 5を判定します。

countが1、2、3、4、5の間は条件が成り立つため、printfで値を表示します。そして、count++でcountを1ずつ増やします。

countが6になると、count <= 5が成り立たなくなるため、while文は終了します。

while文の動きを表で確認する

while文の流れを1回ずつ整理すると、次のようになります。

判定時のcount条件 count <= 5表示される値処理後のcount
112
223
334
445
556
6表示しない6

この表から分かるように、while文では毎回、処理の前に条件式を判定します。countが6になった時点で条件が偽になるため、表示処理は行われません。

while文では更新処理を書き忘れない

while文で特に注意したいのが、条件式に使っている変数をループの中で変化させることです。

先ほどのサンプルでは、次の行がとても重要です。

count++;

この行があることで、countの値が1ずつ増え、最終的にcount <= 5が偽になります。

もしcount++を書き忘れると、countはずっと1のままです。その場合、count <= 5がいつまでも真になり、ループが終わらなくなります。

int count = 1;

while (count <= 5) {
    printf("%d ", count);
}

このようなコードは、無限ループになる可能性があります。

while文を書くときは、次の3点を必ず確認しましょう。

確認すること内容
初期化条件に使う変数に初期値を入れているか
条件式どの条件で繰り返しを続けるのか
更新処理条件がいつか偽になるように値を変えているか

while文は自由度が高い分、条件の変化を自分で管理する必要があります。

do〜while文は処理してから条件を判定する

do〜while文は、処理を先に実行し、そのあとで条件式を判定する構文です。基本の形は次のようになります。

do {
    繰り返したい処理
} while (条件式);

do〜while文では、最初にdoの中の処理を実行します。そのあとでwhileの条件式を判定します。条件式が真であれば、もう一度doの中の処理に戻ります。条件式が偽になったら、do〜while文を終了します。

項目内容
条件判定のタイミング処理の後
最低1回の実行必ず実行される
向いている処理最低1回は表示や入力を行いたい処理
注意点while (条件式); の最後にセミコロンが必要

do〜while文の特徴は、条件式に関係なく、最初の1回は必ず処理が実行されることです。そのため、ユーザーに入力を求める処理や、メニューを表示する処理などで使いやすいです。

図:do〜while文は処理の後に条件を確認する

この図から分かること

この図から分かるのは、do〜while文では条件式を確認する前に、まず処理が実行されるという点です。

そのため、条件式が最初から偽になるような場合でも、処理は1回実行されます。最低1回は処理を行いたい場合に、do〜while文はとても便利です。

do〜while文のサンプルプログラム

次のプログラムでは、do〜while文を使って1から5までの数値を表示します。

プロジェクト/ファイル名: Lesson28_2/main.c

#include <stdio.h>

int main(void) {
    int number = 1;

    // まず数値を表示してから、条件を判定する
    do {
        printf("%d ", number);

        // numberを1増やして、次の繰り返しへ進む
        number++;
    } while (number <= 5);

    printf("\n");

    return 0;
}

実行結果

1 2 3 4 5

このプログラムでは、最初にdoの中の処理が実行されます。numberの値を表示し、number++で1増やします。その後、number <= 5を判定します。

numberが5以下であれば繰り返しを続け、numberが6になると条件が偽になって終了します。

今回のように初期値が1で、5まで表示する場合は、while文とdo〜while文の実行結果は同じになります。しかし、条件判定のタイミングは違います。do〜while文は、必ず先に処理を実行する点を意識しましょう。

do〜while文の最後にはセミコロンが必要

do〜while文で忘れやすいのが、最後のセミコロンです。

do {
    printf("%d ", number);
    number++;
} while (number <= 5);

このように、while (条件式) のあとにセミコロンを書きます。

通常のwhile文では、次のようにwhileの行にセミコロンは付けません。

while (number <= 5) {
    printf("%d ", number);
    number++;
}

この違いは、見た目は小さいですが大切です。do〜while文では、最後のセミコロンまで含めて1つの構文として覚えておきましょう。

while文とdo〜while文の違いを比較する

while文とdo〜while文の一番大きな違いは、条件式を判定するタイミングです。

比較項目while文do〜while文
条件判定処理の前処理の後
最低1回の実行条件が偽なら実行されない必ず1回実行される
条件が最初から偽の場合0回実行1回実行
書式の特徴whileから始まるdoから始まり、最後にwhileを書く
向いている場面条件を満たす場合だけ処理したいまず1回処理してから続けるか判定したい

たとえば、条件に合わない場合は何もしたくない処理ならwhile文が向いています。
一方、入力案内やメニュー表示のように、まず1回は必ず実行したい処理ならdo〜while文が向いています。

違いが分かるサンプルプログラム

次のプログラムでは、入力された数だけ記号を表示します。while文とdo〜while文を並べて書くことで、条件が最初から偽の場合の違いを確認できます。

プロジェクト/ファイル名: Lesson28_3/main.c

#include <stdio.h>

int main(void) {
    int num;
    int i;

    printf("表示する個数を入力してください:");
    scanf("%d", &num);

    printf("while文で表示\n");
    i = 1;

    // iがnum以下の間だけ★を表示する
    while (i <= num) {
        printf("★");
        i++;
    }

    printf("\n");

    printf("do〜while文で表示\n");
    i = 1;

    // まず1回★を表示してから、条件を判定する
    do {
        printf("★");
        i++;
    } while (i <= num);

    printf("\n");

    return 0;
}

実行例1

表示する個数を入力してください:3
while文で表示
★★★
do〜while文で表示
★★★

実行例2

表示する個数を入力してください:0
while文で表示

do〜while文で表示
★

Visual Studioでscanfを使う場合、環境設定によって警告が表示されることがあります。学習用として動作確認する場合は、必要に応じてSDLチェックの設定も確認しておきましょう。

入力値が3の場合の動き

numに3を入力した場合、while文もdo〜while文も★を3つ表示します。

while文では、iが1、2、3の間はi <= numが真です。そのため、★を表示します。iが4になると条件が偽になり、ループを終了します。

do〜while文でも、最初に★を表示し、そのあと条件を判定します。iがnum以下の間は繰り返すため、結果として★が3つ表示されます。

このように、条件が最初から成り立つ場合は、while文とdo〜while文の結果が同じになることがあります。

入力値が0の場合の動き

numに0を入力した場合、違いがはっきり出ます。

while文では、最初にi <= numを判定します。iは1、numは0なので、1 <= 0は偽です。そのため、while文の中の処理は1回も実行されません。

一方、do〜while文では、条件を判定する前にdoの中の処理が1回実行されます。そのため、numが0でも★が1つ表示されます。その後でi <= numを判定し、条件が偽になるためループを終了します。

図:while文とdo〜while文の実行回数の違い

この図から分かること

この図から分かるのは、while文とdo〜while文では、条件が最初から偽だった場合の動きが大きく違うということです。

while文は、最初に条件を判定するため、条件が偽なら処理を実行しません。do〜while文は、最初に処理を実行するため、条件が偽でも1回は処理されます。この違いを理解しておくと、目的に合ったループを選びやすくなります。

while文が向いている場面

while文は、条件を確認してから処理に入りたい場面に向いています。条件が合わない場合は、何も実行したくないときに便利です。

場面while文が向いている理由
条件を満たす間だけ処理したい条件を先に確認できる
データがある場合だけ処理したいデータがなければ実行しない
カウンタが範囲内の間だけ表示したい範囲外なら処理に入らない
入力値が有効な間だけ続けたい無効な場合はすぐ終了できる

たとえば、在庫がある間だけ商品を処理する、入力値が正しい間だけ計算する、といった場合はwhile文が分かりやすいです。

do〜while文が向いている場面

do〜while文は、最低1回は処理を実行したい場面に向いています。特に、ユーザーに入力してもらう処理や、メニューを表示する処理と相性がよいです。

場面do〜while文が向いている理由
メニューを表示する最初に必ず表示できる
入力を受け付けるまず入力してもらってから判定できる
再実行するか確認する1回実行してから続けるか決められる
終了番号が入力されるまで続ける最初の入力案内を必ず出せる

たとえば、ユーザーに番号を選んでもらい、0が入力されたら終了するようなメニュー処理では、do〜while文が自然に使えます。まずメニューを表示し、その後で続けるかどうかを判定できるからです。

for文との使い分けも確認しておく

C言語の繰り返し処理では、for文、while文、do〜while文を使い分けます。

構文向いている場面
for文回数が決まっている繰り返し
while文条件を満たす場合だけ続ける繰り返し
do〜while文最低1回は実行したい繰り返し

for文は、1から10まで繰り返す、配列の要素を順番に処理するなど、回数が見えやすい処理に向いています。

while文は、条件によって続けるかどうかを決めたい場合に向いています。

do〜while文は、まず処理を1回実行し、そのあと条件を確認したい場合に向いています。

while文とdo〜while文でよくある間違い

while文とdo〜while文では、次のようなミスに注意しましょう。

よくある間違い内容
増減処理を書き忘れる条件が変わらず無限ループになる
条件式の向きを間違える繰り返し回数が想定と変わる
do〜while文の最後のセミコロンを忘れる文法エラーになる
最低1回実行されることを忘れるdo〜while文で想定外の処理が行われる
初期値を設定しない条件判定が不安定になる

特に、while文では、条件に使う変数をループ内で更新することが重要です。do〜while文では、条件が偽でも1回は処理されるため、その1回が実行されても問題ない処理かどうかを考える必要があります。

無限ループを防ぐための考え方

while文やdo〜while文では、条件式がいつまでも真のままだとループが終わりません。これを防ぐためには、終了条件をはっきりさせておくことが大切です。

確認項目内容
初期値条件に使う変数が正しく初期化されているか
条件式どの状態まで繰り返すのか
更新処理条件が変化する処理を書いているか
終了条件どの値になったら終わるのか
入力処理入力値によって終了できるか

たとえば、カウンタを使う場合は、カウンタが増えるのか減るのかを確認します。入力値で終了する場合は、どの入力で終了するのかを明確にします。

読みやすく書くためのコツ

while文とdo〜while文は、条件式の書き方によって読みやすさが大きく変わります。

条件を日本語で説明できるようにする

while (count <= 5)なら、countが5以下の間繰り返す、と説明できます。条件を日本語で言い換えられると、意図がはっきりします。

更新処理を見落とさない場所に書く

count++のような更新処理は、ループ内の分かりやすい位置に書きましょう。条件に関係する値がいつ変わるかが見えると、ループの流れを追いやすくなります。

do〜while文は最低1回実行されることをコメントで補足する

do〜while文は、慣れていないと処理順を見間違えやすいです。学習段階では、日本語コメントでまず1回実行することを補足すると分かりやすくなります。

目的に合わせて構文を選ぶ

条件が合う場合だけ処理したいならwhile文、最低1回は処理したいならdo〜while文、回数が決まっているならfor文を使う、というように目的から選ぶと整理しやすくなります。

while文とdo〜while文を理解すると条件付きループが書きやすくなる

while文とdo〜while文は、条件によって繰り返しを続けるかどうかを決めるための構文です。

while文は、最初に条件を判定します。条件が成り立つ場合だけ処理を行うため、処理前に安全確認をしたい場合に向いています。

do〜while文は、最初に処理を実行します。条件に関係なく1回は処理されるため、メニュー表示や入力受付のように、まず動かしたい処理に向いています。

同じ繰り返し処理でも、条件判定のタイミングが違うだけで、実行回数や使いどころが変わります。この違いをしっかり押さえることで、より自然で分かりやすいC言語プログラムを書けるようになります。