CC++ & Algorithm

C++ while与do-while深入

中等18
语言版本:C++Python
概述:理解while和do-while的区别,掌握两种循环的适用场景。

while与do-while:先看条件还是先做一次?

循环是编程中让某段代码重复执行的结构。C++ 里常用的两种循环 whiledo-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 和 continuebreak 可以提前跳出循环,continue 跳过本次循环剩余部分。
  • 嵌套循环:循环里面再放一个循环,比如打印九九乘法表。
  • while(true) 与死循环:有时故意用 while(true) 配合 break 实现“先执行后判断”的效果,但要注意必须有退出条件。

掌握 whiledo-while 的区别,就像掌握了两种不同的“重复”策略。多写几个小练习(猜数字、登录验证、菜单选择),你就能熟练选择了。

例题精讲

1单选题

关于C++中while和do-while循环,下列说法正确的是?

Ado-while循环的循环体至少执行一次
Bwhile循环的循环体至少执行一次
Cdo-while循环先判断条件后执行循环体
Dwhile循环先执行循环体后判断条件
2判断题

在do-while循环中,如果条件表达式的初始值为false,则循环体一次也不会执行。

3填空题
以下代码使用do-while循环计算1到100的和,请填写循环变量更新语句。代码:int sum = 0, i = 1; do{ sum += i; ___ }while(i <= 100);