C++のwhile文・do-while文の違いを徹底解説!ループ処理の初心者ガイド
生徒
「C++で同じ作業を何度も繰り返したいとき、どうすればいいですか?」
先生
「そんな時は『ループ処理』を使います。主にwhile(ワイル)文とdo-while(ドゥ・ワイル)文の2種類がありますよ。」
生徒
「その2つは何が違うんですか?どちらを使っても同じ結果になりますか?」
先生
「実は、最初に条件を確認するか、後で確認するかという大きな違いがあるんです。詳しく見ていきましょう!」
1. プログラミングの「ループ処理」とは?
プログラミングを学んでいると必ず出てくるのが「ループ処理(繰り返し処理)」という言葉です。パソコンは同じ作業を文句も言わずに超高速で繰り返すのが得意な機械です。例えば、画面に「こんにちは」と100回表示させたいとき、自分で100行書くのは大変ですよね。しかし、C++のループ構文を使えば、たった数行のコードで「100回繰り返して」と命令することができます。
C++にはいくつかの繰り返し構文がありますが、その中でも基本となるのが、今回解説するwhile文とdo-while文です。これらは「特定の条件を満たしている間はずっと繰り返す」という性質を持っています。初心者の方が最初につまずきやすいポイントですが、日常生活の例えを使えば非常にシンプルに理解できます。
2. while文の基本構造と使い方
まずは、もっとも一般的なwhile(ワイル)文について解説します。whileとは英語で「~の間」という意味です。つまり、「この条件が正しい(真である)間は、ずっと中身を実行してね」という命令になります。
while文は「前判定」と呼ばれます。これは、処理を始める「前」に、そもそも実行してよいかどうかを確認するからです。例えば、「お腹が空いている間はご飯を食べる」という行動を考えてみましょう。最初に「お腹が空いているか?」を確認し、空いていなければ一口も食べませんよね。これがwhile文の動きです。
#include <iostream>
int main() {
int count = 1; // 回数を数えるための変数
// countが5以下の間は繰り返す
while (count <= 5) {
std::cout << count << "回目の挨拶:こんにちは!" << std::endl;
count++; // countに1を足す(これを忘れると無限ループになります)
}
return 0;
}
1回目の挨拶:こんにちは!
2回目の挨拶:こんにちは!
3回目の挨拶:こんにちは!
4回目の挨拶:こんにちは!
5回目の挨拶:こんにちは!
このコードでは、最初にcountが5以下かどうかをチェックします。条件が合っていれば中身を実行し、終わったらまた上に戻って条件をチェックします。このように、条件が満たされない限り、何度もぐるぐると回り続けます。
3. do-while文の基本構造と特徴
次に、do-while(ドゥ・ワイル)文について見ていきましょう。こちらは「後判定」と呼ばれます。最大の特徴は、条件がどうであれ「最低でも1回は必ず実行される」という点です。日本語に訳すと「とりあえず実行しろ(do)、その後に条件を確認して(while)まだ続けるか決めろ」というニュアンスになります。
例えば、「とりあえず一口食べてみて、美味しかったらおかわりする」というルールのようなものです。一口食べるというアクションは、空腹に関係なく最初に行われます。その後に「もっと食べたいか?」を判断するのです。C++の構文では、最後にセミコロン(;)が必要になるのがwhile文との書き方の違いです。
#include <iostream>
int main() {
int energy = 0; // エネルギーが0の状態
do {
std::cout << "とりあえず1回は動きます!現在のエネルギー:" << energy << std::endl;
} while (energy > 0); // 実行した後に条件を確認(エネルギーが0より大きいか?)
return 0;
}
とりあえず1回は動きます!現在のエネルギー:0
このプログラムでは、条件式であるenergy > 0は最初から「偽(正しくない)」の状態です。しかし、do-while文を使っているため、条件チェックの前に一度だけ出力処理が行われています。
4. whileとdo-whileの決定的な違いとは?
ここまでの説明で、なんとなく違いが見えてきたでしょうか。最も重要な違いは「最初に条件をチェックするか、最後にチェックするか」という順番です。これをプログラミング用語で、while文を「前置判定」、do-while文を「後置判定」と呼びます。
具体的に、どのような場面で使い分けるべきかを整理しましょう。
- while文:一度も実行したくない場合があるときに使う。例えば、「ファイルが空なら何もしない」「最初からデータがない場合は処理を飛ばす」といったケースです。
- do-while文:最低一回はユーザーに入力させたい時や、必ず初期化処理を動かしたい時に使う。例えば、「パスワード入力を求める(入力してもらうまで正解か判断できない)」といったケースです。
もし条件が最初から満たされていない場合、while文は「実行回数0回」になりますが、do-while文は「実行回数1回」になります。この「0か1か」の差が、システム開発においては非常に大きな意味を持ちます。バグ(プログラムのミス)を防ぐためにも、この実行順序を意識することが大切です。
5. 初心者が注意すべき「無限ループ」の恐怖
ループ処理を扱う上で、絶対に避けては通れないのが「無限ループ」という現象です。これは、繰り返しを終わらせるための条件がいつまで経っても満たされず、プログラムが永遠に動き続けてしまう状態を指します。パソコンの動作が重くなったり、フリーズしたりする原因の多くは、この無限ループによるものです。
例えば、先ほどのwhile文で、数字をカウントアップするcount++(変数の中身を1増やす命令)を書き忘れたとしましょう。すると、countは永遠に1のままなので、条件の「5以下」をずっと満たし続けてしまいます。すると、画面には「こんにちは!」という文字が凄まじい勢いで表示され続け、止まらなくなります。
#include <iostream>
int main() {
int i = 10;
// もし条件を「iが0より大きい間」にして、iを減らさなかったら…
while (i > 0) {
std::cout << "止まらないループ!" << std::endl;
// i--; この一行を忘れると大変なことに!
}
return 0;
}
もし間違えて無限ループを作ってしまった場合は、多くの開発環境では「Ctrl + C」キーなどを押すことで強制終了させることができます。コードを書くときは必ず「いつ、どうやってこのループは終わるのか?」をセットで考える癖をつけましょう。これは、C++エンジニアとして必須のスキルです。
6. 実践的な使い方:ユーザー入力のバリデーション
では、do-while文が実際に役立つ例を紹介します。代表的なのが、ユーザーに正しい数値を入力してもらうまで何度も聞き返す処理です。これを「バリデーション(妥当性確認)」と呼びます。1から10までの数字を入れてほしいのに、ユーザーが間違えて100を入れた場合、再度入力を促す必要がありますよね。
#include <iostream>
int main() {
int number;
// 正しい数字が入力されるまで繰り返す
do {
std::cout << "1から10の数字を入力してください:";
std::cin >> number; // ユーザーから数字を受け取る
} while (number < 1 || number > 10); // 1未満、または10より大きい場合はやり直し
std::cout << "ありがとうございます!" << number << "を受け付けました。" << std::endl;
return 0;
}
ここでは、まず「入力してください」と表示(do)し、その後に入力された値が正しい範囲内かをチェック(while)しています。もし値が正しくなければ、また最初に戻って入力を求めます。このように、「最低でも一度は何かをさせて、その結果を見て継続を判断する」という流れにdo-whileは最適です。
7. bool型を使ったスマートな条件指定
ループの条件には、数字の比較だけでなくbool(ブール)型というものもよく使われます。これは「真(true)」か「偽(false)」の2つの値だけを持つ特別な型です。日本語で言えば「はい」か「いいえ」です。これを使うと、コードがより読みやすく、直感的になります。
例えば、ゲームのループ処理などで「ゲームオーバーフラグ」がtrueになるまで続ける、といった書き方が可能です。初心者のうちは数字の比較だけで十分ですが、少し慣れてきたら、この「状態」でループを制御する方法も覚えておくと、複雑なプログラムもスッキリと書けるようになります。C++の柔軟な制御構文を使いこなすことで、あなたのプログラミングスキルは一段と向上するはずです。