C++入門|while文による繰り返し処理

while文は、条件が成り立つ間だけ修行を続ける繰り返しの基本技。終了条件を見極めながら処理を進めれば、C言語のループ処理がぐっと分かりやすくなります。

C言語では、同じ処理を何度も実行したいときに、繰り返し処理を使います。

前に学んだfor文は、開始値、条件、増分処理を1行にまとめて書ける便利な繰り返し処理でした。
一方で、C言語にはもうひとつよく使われる繰り返し処理があります。

それが while文 です。

while文は、条件が成り立っている間、同じ処理を繰り返します。
ドラゴンボール風にたとえるなら、while文は「修行条件を満たしている間だけ続く特訓」です。

たとえば、修行回数が5回以下の間は技を出し続ける、体力が残っている間は修行を続ける、敵の戦闘力が一定以上なら警戒を続ける、というように、条件を確認しながら処理を進めるときに使います。

for文が「1回目から5回目まで修行する」といった回数管理に強い書き方だとすれば、while文は「条件が成り立つ間は修行を続ける」という考え方が見えやすい書き方です。

繰り返し処理特徴ドラゴンボール風のイメージ
for文初期化、条件、増分を1行にまとめやすい修行回数を最初から決めて進める
while文条件が成り立つ間、処理を繰り返す条件を確認しながら修行を続ける

while文は、C言語でもC++でもよく使う大切な基本文法です。

ここでは、while文の書き方、動く順番、for文との違い、注意点まで、ゆっくり整理していきましょう。

while文を使ったプログラム

まずは、while文を使ったサンプルプログラムを見てみましょう。

今回は、修行回数を1回目から5回目まで表示するプログラムにします。
変数roundを使って、現在の修行回数を数えながら、while文で繰り返します。

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

#include <stdio.h>

int main(int argc, char** argv) {
    // 修行回数を表す変数を1で初期化する
    int round = 1;

    // roundが5以下の間、修行回数を表示する
    while (round <= 5) {
        printf("%d回目の修行\n", round);

        // 次の修行回数へ進める
        round++;
    }

    // プログラムが正常に終わったことを示す
    return 0;
}

このプログラムを実行すると、次のように表示されます。

1回目の修行
2回目の修行
3回目の修行
4回目の修行
5回目の修行

このプログラムでは、roundという変数を使って修行回数を数えています。

最初にroundへ1を代入します。
そして、round <= 5 という条件が成り立っている間、while文の中にある処理を繰り返します。

1回表示するたびにround++で値を1増やします。
roundが6になると、round <= 5 が成り立たなくなるため、while文の繰り返しが終了します。

処理内容ドラゴンボール風のイメージ
int round = 1;修行回数を1から始める1回目の修行から開始
while (round <= 5)5回目まで続ける条件5回以下なら修行続行
printf現在の修行回数を表示修行装置のパネルに回数を表示
round++回数を1増やす次の修行へ進む
roundが6になる条件が成り立たなくなる修行終了

図:while文で修行回数を表示する流れ

この図が示していること

この図では、while文がどのような順番で動くのかを表しています。

まずroundに1を入れます。次に、round <= 5 が成り立っているかを確認します。条件が成り立っていれば、while文の中の処理を実行して修行回数を表示します。

そのあとround++で値を1増やし、もう一度条件確認へ戻ります。
この流れを繰り返し、roundが6になって条件が成り立たなくなると、while文から抜けます。

while文の書式

while文の基本的な書き方は、次の形です。

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

while文は、丸カッコの中に書いた条件式を確認します。

条件式が成り立っている場合は、中カッコの中に書いた処理を実行します。
処理が終わると、もう一度条件式を確認します。
まだ条件が成り立っていれば、また中の処理を実行します。

条件が成り立たなくなったら、while文の繰り返しは終了します。

部分役割今回の例
while条件が成り立つ間、繰り返す命令while
条件式続けるかどうかを判断する条件round <= 5
{ }繰り返す処理の範囲printfとround++
処理条件が成り立つ間に実行される内容修行回数の表示

ドラゴンボール風に言えば、while文の条件式は修行装置の判定ルールです。

round <= 5 という条件は、「修行回数が5回以下なら、まだ修行を続ける」という意味になります。
条件を満たしている間は修行を続け、条件を満たさなくなったら修行終了です。

while文は条件を先に確認する

while文で大切なのは、処理を実行する前に条件を確認する という点です。

今回のプログラムでは、最初にroundの値が1です。

int round = 1;

そのあと、while文の条件式を確認します。

while (round <= 5)

roundは1なので、round <= 5 は成り立ちます。
そのため、中カッコの中の処理が実行されます。

もし最初からroundが6だった場合はどうでしょうか。

int round = 6;

この場合、最初の条件確認で round <= 5 が成り立ちません。
そのため、while文の中の処理は1回も実行されません。

roundの最初の値条件 round <= 5while文の中身
1成り立つ実行される
5成り立つ実行される
6成り立たない実行されない

ドラゴンボール風にたとえるなら、while文は修行を始める前に、まず修行条件を確認する装置です。
条件を満たしていれば修行場に入れますが、条件を満たしていなければ、最初から修行は始まりません。

while文の働きを順番に見る

今回のプログラムでは、while文は次の順番で動きます。

int round = 1;

while (round <= 5) {
    printf("%d回目の修行\n", round);
    round++;
}

処理の流れを表にすると、次のようになります。

繰り返しroundの値条件 round <= 5表示される内容round++後
1回目1成り立つ1回目の修行2
2回目2成り立つ2回目の修行3
3回目3成り立つ3回目の修行4
4回目4成り立つ4回目の修行5
5回目5成り立つ5回目の修行6
終了判定6成り立たない表示しない終了

この流れを見ると、while文は条件確認、処理、値の更新を繰り返していることが分かります。

ドラゴンボール風に言えば、修行装置が毎回こう確認しています。

今の修行回数は5回以下か。
5回以下なら修行を表示する。
終わったら回数を1増やす。
もう一度、5回以下か確認する。

これを、条件が成り立たなくなるまで続けます。

初期化はwhile文の前に書く

for文では、初期化処理、条件式、増分処理を1行の中にまとめて書けました。

for (round = 1; round <= 5; round++)

一方で、while文では、丸カッコの中に書くのは条件式だけです。

while (round <= 5)

そのため、round = 1 のような初期化処理は、while文の前に書きます。

int round = 1;
処理for文while文
初期化for文の丸カッコ内に書けるwhile文の前に書く
条件式for文の丸カッコ内に書くwhile文の丸カッコ内に書く
増分処理for文の丸カッコ内に書けるwhile文の中に書く

ドラゴンボール風にたとえるなら、for文は修行メニュー表に「開始回数」「続ける条件」「回数の進め方」が全部まとめて書かれています。

一方、while文では「続ける条件」は修行装置に書かれていますが、「最初の回数」と「回数を進める処理」は別の場所に書く必要があります。

ここがfor文とwhile文の大きな違いです。

図:for文とwhile文の書き方の違い

この図が示していること

この図では、for文とwhile文の書き方の違いを表しています。

for文では、初期化処理、条件式、増分処理を1行にまとめて書けます。
一方、while文では、丸カッコの中に書くのは条件式だけです。

そのため、初期化処理はwhile文の前に、増分処理はwhile文の中に書きます。
同じ繰り返し処理でも、どこに何を書くのかが違うことを意識すると、while文が読みやすくなります。

増分処理はwhile文の中に書く

今回のプログラムでは、while文の中にround++があります。

round++;

これは、roundの値を1増やす処理です。

このround++があるからこそ、roundは1、2、3、4、5、6と変化していきます。
そしてroundが6になったとき、round <= 5 が成り立たなくなり、while文が終了します。

もしround++を書き忘れると、roundの値はずっと1のままです。
すると、round <= 5 はずっと成り立ち続けます。

その結果、while文が終わらなくなる可能性があります。

while (round <= 5) {
    printf("%d回目の修行\n", round);
}

このように値を更新しないままだと、条件が変わらず、同じ処理が続き続けてしまいます。

ドラゴンボール風にたとえるなら、修行カウンターが1回目のまま止まっている状態です。
修行装置はいつ見ても「まだ1回目だから続行」と判断してしまい、終わらない修行になってしまいます。

状態結果
round++があるroundが増えて、いつか条件が成り立たなくなる
round++がないroundが変わらず、ループが終わらない可能性がある

while文では、条件を変化させる処理を忘れないことがとても大切です。

while文で無限ループに注意する

while文では、条件がずっと成り立つと、繰り返しが終わらなくなります。
このような状態を無限ループと呼びます。

無限ループは、意図して使うこともありますが、初心者のうちはうっかり起こしてしまうことが多いです。

たとえば、次のような場合です。

int round = 1;

while (round <= 5) {
    printf("%d回目の修行\n", round);
}

この場合、round++がないため、roundはずっと1のままです。
そのため、round <= 5 はずっと成り立ち続けます。

原因どうなるか
変数の値を更新していない条件が変わらない
条件がずっと成り立つ繰り返しが終わらない
結果無限ループになる可能性がある

ドラゴンボール風にいうと、修行装置が終了条件を確認しているのに、修行回数カウンターが一切進まない状態です。
いつまでたっても終了条件に届かないため、修行が終わりません。

while文を書くときは、次の3つを確認すると安心です。

確認すること内容
初期値はあるかround = 1 のように開始値を決めているか
条件式は正しいかround <= 5 のように終了へ向かう条件か
更新処理はあるかround++ のように値が変化するか

while文は条件中心で考えると分かりやすい

while文を理解するときは、何回繰り返すかよりも、条件が成り立っているかどうか に注目すると分かりやすくなります。

今回の条件は、次のとおりです。

round <= 5

これは、roundが5以下なら繰り返すという意味です。

roundが1、2、3、4、5の間は条件が成り立ちます。
roundが6になると条件が成り立たなくなります。

roundの値round <= 5判断
1繰り返す
2繰り返す
3繰り返す
4繰り返す
5繰り返す
6終了する

C言語では、条件が成り立つことを真、成り立たないことを偽と考えます。
while文は、条件式が真の間だけ処理を繰り返します。

ドラゴンボール風にたとえるなら、修行装置が毎回スカウターで条件を確認しているイメージです。

条件OKなら修行続行。
条件NGなら修行終了。

この考え方がwhile文の中心です。

図:while文は条件が真の間だけ繰り返す

この図が示していること

この図では、while文が条件式を確認しながら繰り返す仕組みを表しています。

round <= 5 が真であれば、修行回数を表示してround++を行います。
そのあと、もう一度条件式を確認します。

roundが6になると、round <= 5 が偽になります。
その時点でwhile文は終了し、次の処理へ進みます。

while文は、条件が真の間だけループするという考え方を持っています。

for文とwhile文の使い分け

for文とwhile文は、どちらも繰り返し処理を行うための文です。

では、どのように使い分ければよいのでしょうか。

分かりやすい目安として、繰り返す回数がはっきりしている場合はfor文、条件を中心に考えたい場合はwhile文が向いています。

使いたい場面向いている文理由
1から5まで表示したいfor文回数の流れが1行にまとまりやすい
条件が成り立つ間だけ続けたいwhile文条件を中心に書ける
カウンターを使って回数管理したいfor文またはwhile文どちらでも書ける
値がいつ条件を満たさなくなるかを見たいwhile文条件確認の流れが見えやすい

今回のように1から5まで表示する処理は、for文でもwhile文でも書けます。

for文で書くと、開始値、条件、増分がまとまって見えます。
while文で書くと、条件を確認しながら処理を続ける流れが分かりやすくなります。

ドラゴンボール風にたとえるなら、for文は「5回修行する」と決めているメニュー表です。
while文は「修行回数が5回以下なら続ける」と毎回確認する修行装置です。

どちらも大切なので、両方の書き方に慣れておくと、C言語の繰り返し処理がかなり理解しやすくなります。

while文で覚えておきたいポイント

while文を使うときは、次のポイントを意識しましょう。

ポイント内容
条件式を書くwhileの丸カッコ内に続ける条件を書く
初期化は前に書くint round = 1 のように開始値を準備する
更新処理を書くround++ のように値を変化させる
条件が偽になると終了round <= 5 が成り立たなくなると抜ける
無限ループに注意値が変わらないと終わらない可能性がある

while文は、for文よりも書く場所が分かれているため、最初は少し注意が必要です。

初期化、条件式、更新処理の3つを意識すると、while文はかなり読みやすくなります。

今回のプログラムでは、次の3つが対応しています。

役割記述
初期化int round = 1;
条件式while (round <= 5)
更新処理round++;

この3つがそろっていることで、roundが1から5まで進み、最後に6になったところでwhile文が終了します。

while文は条件を見ながら進む修行メニュー

while文は、条件が成り立っている間、同じ処理を繰り返すための文です。

for文のように、初期化、条件、増分を1行にまとめるのではなく、初期化は前に書き、条件式はwhileの中に書き、更新処理は中カッコの中に書きます。

この書き方に慣れると、while文はとても自然に読めるようになります。

ドラゴンボール風に言えば、while文は修行装置が毎回条件を確認しながら進める特訓です。

roundが5以下なら修行続行。
修行回数を表示したら、round++で次へ進む。
roundが6になったら条件を満たさないので終了。

この流れを理解できれば、while文による繰り返し処理の基本はしっかりつかめています。

C言語では、繰り返し処理を使えるようになると、プログラムでできることが一気に増えます。
同じ処理を何度も書くのではなく、条件を使って効率よく繰り返す。
その基本技として、while文をしっかり身につけていきましょう。