C++ while与do-while深入
中等18while与do-while:先看条件还是先做一次?
循环是编程中让某段代码重复执行的结构。C++ 里常用的两种循环 while 和 do-while 就像两个性格不同的朋友:一个“先看条件再行动”,一个“先做一次再说”。理解它们的区别,能帮你写出更合适、更安全的循环代码。
while 循环:先检查,后执行
工作原理:先判断循环条件是否为真(true),如果为真,就执行循环体;执行完再回到条件判断,直到条件为假(false)时退出循环。如果一开始条件就是假的,循环体一次也不会执行。
生活中的例子:写作业
想象你每天写作业前,妈妈会先问:“作业写完了吗?”
- 如果写完了(条件为假),就不用写了(循环结束)。
- 如果没写完(条件为真),就继续写(执行循环体)。
哪怕你原本已经写完了,妈妈也不会让你再做一遍——这和 while “可能一次都不执行” 的特点一致。
int homework = 3; // 还有3道题没写
while (homework > 0) { // 条件:没写完的题数>0
cout << "写一道题,还剩 " << homework - 1 << " 道" << endl;
homework--; // 每写一道,未完成数减1
}
// 输出:写一道题,还剩2道
// 写一道题,还剩1道
// 写一道题,还剩0道
另一个例子:检查密码
假设你要登录游戏,程序会循环询问密码,直到输入正确。但如果第一次输入就正确,循环体(提示“密码错误”)就不需要执行。用 while 最合适。
#include <iostream>
#include <string>
using namespace std;
int main() {
string password = "abc123"; // 正确密码
string input; // 用户输入的密码
cout << "请输入密码:";
cin >> input;
while (input != password) { // 只要输入不等于正确密码
cout << "密码错误,请重新输入:";
cin >> input;
}
cout << "登录成功!" << endl;
return 0;
}
do-while 循环:先做一次,再检查
工作原理:先执行一次循环体,然后判断条件。如果条件为真,就继续重复;如果条件为假,就退出。循环体至少会执行一次,哪怕条件一开始就是假的。
生活中的例子:先写一道题再问
妈妈换了一种方式:先让你“写一道题”,然后问“作业写完了吗?”
- 如果没写完,就再写一道,再问……
- 如果写完了,就停止。
即使你本来已经写完了,妈妈也会让你先写一道题(执行一次循环体),然后才发现已经写完了(条件为假退出)。
int homework = 0; // 一开始就已经写完了
do {
cout << "先写一道题,然后检查剩余:";
homework--; // 这一写,题数变成 -1
} while (homework > 0); // 条件:homework > 0 ? 现在是 -1,假,循环结束
// 输出:先写一道题,然后检查剩余:
// 循环体执行了一次,虽然homework一开始为0
猜数字游戏(经典例子)
程序随机生成一个 1~10 的数字,用户反复猜直到猜对。因为至少要先猜一次,用 do-while 很自然。
#include <iostream>
#include <cstdlib> // 提供 rand() 和 srand()
#include <ctime> // 提供 time()
using namespace std;
int main() {
srand(time(0)); // 初始化随机数种子
int secret = rand() % 10 + 1; // 生成1~10的随机数
int guess; // 用户猜的数字
do {
cout << "猜一个1~10的数字:";
cin >> guess;
if (guess > secret) cout << "太大了!" << endl;
else if (guess < secret) cout << "太小了!" << endl;
} while (guess != secret); // 没猜对就继续
cout << "恭喜你猜对了!" << endl;
return 0;
}
什么时候用 while,什么时候用 do-while?
-
如果循环体可能一次都不需要执行 → 用
while。
例如:检查密码(第一次输入可能就正确)、检查账户余额是否足够、判断一个数是否为正数再计算平方根。 -
如果循环体至少需要执行一次 → 用
do-while。
例如:显示菜单(先显示一次再让用户选择)、猜数字(先猜一次再判断)、输入成绩直到合法(先输入一次再检查范围)。
新手常见错误
1. 忘记更新循环变量导致死循环
int i = 0;
while (i < 5) {
cout << "Hello" << endl;
// 忘记写 i++,条件永远为真,程序永远运行
}
解决方法:确保循环体内有改变条件的语句(如 i++、homework-- 等)。
2. do-while 末尾忘记分号
int x = 10;
do {
cout << x << endl;
x--;
} while (x > 5) // 漏了分号!编译错误
解决方法:养成在 while(条件); 后加英文分号的习惯。
3. 条件写反了(写成 while(条件为假时继续))
int score = 85;
while (score < 0 || score > 100) { // 想重复输入直到成绩合法
cin >> score;
}
// 如果一开始 score=85(合法),条件为假,不会进入循环,正确。
// 但如果写成了 while(score >= 0 && score <= 100),
// 则合法的成绩反而会进入循环,变成死循环。
解决方法:把条件想清楚——循环条件应该指出“什么时候需要重复”,而不是“什么时候结束”。
4. do-while 循环体至少执行一次带来的“意外”
例如用户不想玩猜数字了,但程序先让你猜了一次再问“是否继续”,这可能不符合要求。这时用 while 先询问会更合适。
完整可运行示例:输入成绩直到合法(对比两种写法)
#include <iostream>
using namespace std;
int main() {
int score; // 成绩
// 方法1:用 while,第一次输入前先判断
cout << "请输入成绩(0~100):";
cin >> score;
while (score < 0 || score > 100) {
cout << "不合法!请重新输入(0~100):";
cin >> score;
}
cout << "你输入的成绩是:" << score << endl;
// 方法2:用 do-while,至少输入一次
int grade;
do {
cout << "请输入另一个成绩(0~100):";
cin >> grade;
} while (grade < 0 || grade > 100);
cout << "你输入的成绩是:" << grade << endl;
return 0;
}
说明:两种写法都能完成功能,但 do-while 更简洁,因为它把“输入”操作放在循环体里,不需要在循环外面单独写一次输入。
注意:如果用户一开始输入的就是合法值,while 版本不需要重复输入;do-while 也会先让你输入一次再判断,结果是一样的。
相关知识点指引
- for 循环:另一种常用的循环,适合已知循环次数的情况(如从1数到10)。可以学习
for (int i=0; i<n; i++)的写法。 - break 和 continue:
break可以提前跳出循环,continue跳过本次循环剩余部分。 - 嵌套循环:循环里面再放一个循环,比如打印九九乘法表。
- while(true) 与死循环:有时故意用
while(true)配合break实现“先执行后判断”的效果,但要注意必须有退出条件。
掌握 while 和 do-while 的区别,就像掌握了两种不同的“重复”策略。多写几个小练习(猜数字、登录验证、菜单选择),你就能熟练选择了。
例题精讲
关于C++中while和do-while循环,下列说法正确的是?
在do-while循环中,如果条件表达式的初始值为false,则循环体一次也不会执行。
以下代码使用do-while循环计算1到100的和,请填写循环变量更新语句。代码:int sum = 0, i = 1; do{ sum += i; ___ }while(i <= 100);