C++のwhile文は、ある条件が成り立っている間、同じ処理を繰り返すための構文です。
繰り返し処理を書く方法はいくつかありますが、その中でもwhile文は、何回繰り返すかよりも、どんな条件の間は続けるかを重視したい場合に特に使いやすいものです。
たとえば、
- 条件を満たしている間だけ処理を続けたい
- 正しい入力が行われるまで何度も受け付けたい
- 終了条件があとから決まるような処理をしたい
といった場面でよく使われます。
while文の基本的な動き
while文は、次のような流れで動きます。
まず最初に、指定した条件を確認します。
その条件が成り立っていれば、繰り返したい処理を実行します。
処理が終わると、もう一度同じ条件を確認します。
そして、条件が成り立っている間はその流れを何度も繰り返し、条件が成り立たなくなった時点で終了します。
この特徴をひとことで言うと、while文は先に条件を調べてから実行するループです。
そのため、最初の確認の時点で条件が成り立っていなければ、繰り返しの中身は一度も実行されません。
while文を理解するための3つの視点
while文を正しく理解するには、次の3つを分けて考えるとわかりやすくなります。
ひとつ目は、最初の状態です。ループを始める前に、どんな値や状態からスタートするのかを決めます。
ふたつ目は、続ける条件です。
どの状態の間は繰り返しを続けるのか、逆に言えば、どの状態になったら終わるのかを考えます。
みっつ目は、状態の変化です。
毎回の繰り返しの中で、次の判定に向けて何が変わるのかを意識する必要があります。
while文でつまずく人の多くは、この3つのうちどれかを見落としています。
特に多いのは、条件を変化させる処理を書き忘れることです。
無限ループが起きる理由
while文では、条件が真の間は処理を繰り返します。
したがって、条件に関係する状態がずっと変わらないと、いつまでも終了条件にたどりつけません。
この状態を無限ループといいます。
無限ループは、意図せず起こすとプログラムが終わらなくなる原因になります。
初心者がよくやってしまうのは、繰り返しの中で数値を増やしたり減らしたりするつもりが、その更新を忘れてしまうことです。
while文を使うときは、「このループは、どうやって終わるのか」を必ず確認するのが大切です。
最初から実行されないこともある
while文は、処理に入る前に条件を確認します。
そのため、開始時点で条件が成り立っていない場合は、繰り返しの中身がまったく実行されません。
これはwhile文の大きな特徴です。
似た構文にdo-while文がありますが、そちらは最初に一度処理を実行してから条件を調べます。
一方でwhile文は、あくまで条件が先です。
この違いを理解しておくと、どちらを使うべきか判断しやすくなります。
条件式について知っておくべきこと
while文の条件には、単純な「はい・いいえ」だけを書くとは限りません。
C++では、最終的に真か偽かとして判断できる式であれば条件として使えます。
つまり、明確に真偽値を返す比較だけでなく、値そのものが真か偽かとして扱われる場合もあります。
この性質は便利な一方で、初心者にとっては思わぬミスの原因にもなります。
特に注意したいのが、比較したつもりで代入を書いてしまうミスです。
本来は「等しいかどうか」を調べたいのに、「値を代入する」書き方になってしまうと、意図しない結果になります。
この種のミスは、見た目が似ているため非常に起こりやすく、場合によってはループが終わらなくなる原因になります。
while文で条件を書くときは、比較なのか、代入なのかを丁寧に確認する必要があります。
初期化の重要性
while文に限りませんが、使う変数は必ず適切に初期化しておく必要があります。
特に、繰り返し条件に関わる変数が初期化されていないと、どんな値を持っているかわからない状態で判定が行われてしまいます。
これは単に「危ない」というだけではなく、C++では未定義動作の原因になり得ます。
つまり、期待した通りに動かないだけでなく、挙動そのものを信用できなくなります。
そのため、while文を使うときは、
- ループに入る前の値は正しいか
- その値で最初の判定をしてよいか
を必ず確認することが大切です。
while文が向いている場面
while文は、「何回繰り返すか」が最初からきっちり決まっている処理にも使えます。
ただし、そのような場面では別の構文のほうが見やすいこともあります。
while文が特に向いているのは、終了条件が中心になる処理です。
たとえば、ある条件を満たしている間だけ続けたい場合や、ユーザーが特定の値を入力するまで何度も受け付けたい場合などです。
要するに、while文は「回数」で考えるよりも、“まだこの条件が続いているから処理を続ける”という考え方に合っています。
for文との違い
C++では、繰り返し処理にfor文もよく使われます。
for文とwhile文は、できることが完全に分かれているわけではありません。
同じような処理を、どちらでも書けることはよくあります。
ただし、使い分けの目安はあります。
for文は、開始・条件・更新をひとまとまりで書けるため、回数がはっきりしている繰り返しに向いています。
一方でwhile文は、継続条件に注目しやすいため、条件中心で考えたい繰り返しに向いています。
つまり、厳密に「こちらしか使えない」という違いではなく、どちらのほうが意図を読み取りやすいかという観点で使い分けるのが自然です。
do-while文との違い
while文と似たものにdo-while文があります。
この2つの大きな違いは、条件を調べるタイミングです。
while文は、最初に条件を調べてから処理を行います。
そのため、条件が最初から成り立っていなければ一度も実行されません。
一方でdo-while文は、最初に処理を一度実行し、そのあとで条件を調べます。
したがって、条件に関係なく少なくとも1回は実行されます。
この違いはとても重要です。
「最低1回は必ず実行したい」のか、「条件を満たすときだけ実行したい」のかで、選ぶべき構文が変わります。
breakとcontinue
while文の中では、繰り返しの流れを変えるための仕組みとしてbreakとcontinueが使えます。
breakは、その場でループを終了させます。
本来の終了条件を待たずに、途中で抜けたいときに使います。
たとえば、特定の条件を満たした瞬間に処理を打ち切りたい場合に便利です。
continueは、その回の残りの処理を飛ばして、次の判定へ進みます。
ただし、これを使うときは注意が必要です。
条件に関係する更新処理より前でcontinueしてしまうと、状態が変わらず、結果として無限ループになることがあります。
つまり、continueは便利ですが、「このあと状態はちゃんと更新されるか」を意識しないと危険です。
意図的な無限ループ
無限ループは普通は避けるべきものですが、場合によっては意図的に使うこともあります。
たとえば、常に動き続ける処理や、終了のきっかけを途中の判定に任せたい場合です。
このような書き方をするときは、どこかで明確に終了できる仕組みを入れておくのが一般的です。
そうしないと、本当に止まらない処理になってしまいます。
つまり、意図的な無限ループは「間違い」ではありませんが、出口の設計が必要なループだと考えると理解しやすいです。
while文でよくある誤解
while文を学び始めたときに起きやすい誤解はいくつかあります。
ひとつは、繰り返し処理を書けば自動的に終わると思ってしまうことです。
実際には、条件を変化させる仕組みがなければ終わりません。
もうひとつは、条件に書いた式がどのように評価されるかを十分に意識していないことです。
比較のつもりが代入になっていたり、真偽値として扱われる値の性質を理解していなかったりすると、予想外の動作につながります。
さらに、初期値・条件・更新の関係をバラバラに考えてしまうと、ループの全体像が見えにくくなります。
while文はシンプルな構文ですが、だからこそ自分で状態の流れを意識する力が重要になります。
while文を理解するコツ
while文を読むときは、頭の中で次のように言い換えると理解しやすくなります。
「この条件が成り立っている間は、下の処理を繰り返す」
この読み方が自然にできるようになると、while文はかなりわかりやすくなります。
さらに、毎回次の3つを確認すると混乱しにくくなります。
- いま、どんな状態から始まるのか
- どんな間は続くのか
- 次の判定のために何が変わるのか
この3点を意識するだけで、while文の理解はかなり安定します。
まとめ
C++のwhile文は、条件が成り立っている間、処理を繰り返すための構文です。
先に条件を調べるため、最初から条件が成り立っていなければ一度も実行されません。
また、while文では条件に関係する状態が適切に変化しないと、無限ループになることがあります。
そのため、使うときは
- 最初の状態
- 続ける条件
- 状態の更新
をセットで考えることがとても大切です。
while文は、回数よりも条件を中心に考えたい処理で特に使いやすく、入力の繰り返しや終了条件待ちの処理などでよく活躍します。
一方で、条件式の書き方や更新の位置を誤ると、初心者がつまずきやすい構文でもあります。
だからこそ、while文はただ形を覚えるのではなく、「なぜ続くのか」「どうやって終わるのか」を意識しながら学ぶことが重要です。
以上、C++のwhile文についてでした。
最後までお読みいただき、ありがとうございました。
