C++ do...while 循环

在 C++ 中,我们可以使用 do...while 语句来实现循环。它的特点是把 “执行代码” 放在前面,把 “条件判断” 放在后面。

与 while 循环不同,do...while 语句会先无条件执行一次循环体,然后再判断条件是否成立。如果条件成立,则继续重复执行循环体;如果条件不成立,则直接退出循环。

C++ do...while 语法

do 在英文中是 “做、执行” 的意思。从字面上就很好理解,do...while 就是先动手做一次,再看条件要不要继续。

语法:

do {
    // 循环执行的代码
} while (条件);

说明:

程序执行到 do 时,不会先检查条件,而是直接进入花括号 {} 执行里面的循环体代码。等这一轮代码执行完毕后,再去判断末尾 while 小括号中的 “条件”。如果条件返回 true,就回到 do 继续执行下一轮;如果条件返回 false,则直接结束整个循环。

需要特别注意的是,普通的 while 循环在小括号后面不能加分号,而 do...while 语句末尾的 while (条件) 后面必须加上一个英文分号(;),这是初学者最容易忽略的一点:

// 正确方式
do {
    std::cout << n << '\n';
    n++;
} while (n <= 5);

// 错误方式
do {
    std::cout << n << '\n';
    n++;
} while (n <= 5)

上面的错误方式漏掉了末尾的分号,编译器会直接报错。

C++ do...while 示例

接下来,我们通过两个简单的例子来看看 do...while 循环是如何使用的,以及它与 while 循环有什么本质区别。

示例 1:输出 1 到 5 的整数

#include <iostream>

int main() {
    int n = 1;

    do {
        std::cout << n << '\n';
        n++;
    } while (n <= 5);

    return 0;
}

运行结果如下。

1
2
3
4
5

分析:

在这个例子中,变量 n 的初值为 1。程序遇到 do 后直接进入花括号,输出 1 并执行 n++ 使 n 变为 2,随后判断 n <= 5 返回 true,回到 do 继续下一轮。当第 5 轮输出 5 并执行 n++ 后,n 变为 6,此时 6 <= 5 返回 false,循环结束。

当初始条件本来就满足时,do...while 和 while 的运行结果是完全一样的。两者的真正区别体现在 “初始条件一开始就不成立” 的时候。如果把上面代码中 n 的初值改成 6,结果会有什么不同呢?我们把两种循环放在一起对比一下。

示例 2:初始条件不成立时的对比

#include <iostream>

int main() {
    int n = 6;

    std::cout << "while 输出:\n";
    while (n <= 5) {
        std::cout << n << '\n';
        n++;
    }

    std::cout << "do...while 输出:\n";
    do {
        std::cout << n << '\n';
        n++;
    } while (n <= 5);

    return 0;
}

运行结果如下。

while 输出:
do...while 输出:
6

分析:

从运行结果可以看出,当 n 的初值为 6、判断条件同为 n <= 5 时,两种循环的表现完全不同。

在 while 循环中,第一次判断 6 <= 5 直接返回 false,因此花括号里的循环体一次都不会执行。

而在 do...while 循环中,程序会先进入 do 把 6 打印出来并让 n 变为 7,最后才去判断 7 <= 5。虽然此时条件同样为 false,但第一轮循环体已经执行过了,所以屏幕上依然输出了 6。

提示 小伙伴们可以用一句话区分它们:while 循环是 “先判断、后执行”,循环体最少执行 0 次;do...while 循环是 “先执行、后判断”,循环体最少执行 1 次。

C++ do...while 的适用场景

在实际开发中,大多数情况下我们使用的都是 while 循环或 for 循环,较少使用 do...while 循环。主要是因为 do...while 会先无条件执行一次循环体,如果不留意初始数据,有时反而会多执行一次不该执行的操作。

不过,在 “必须先执行一次操作,拿到结果后才能判断是否需要重来” 的场景下,do...while 循环就非常自然了。比如校验用户输入的数字密码:程序必须先读取一次输入,才能检查数值合不合格。如果不符合要求,就继续提示用户重新输入。

示例 3:校验用户输入的密码

#include <iostream>

int main() {
    int password = 0;

    do {
        std::cout << "请输入密码(1000~9999):";
        std::cin >> password;
    } while (password < 1000 || password > 9999);

    std::cout << "密码输入正确\n";
    return 0;
}

运行之后,当我们先输入 “123”,再输入 “6666”,其输出结果如下。

请输入密码(1000~9999):123
请输入密码(1000~9999):6666
密码输入正确

分析:

在这个例子中,程序先进入 do 内部,通过 std::cin 读取键盘输入的整数并存入 password,再去检查数值是否合格。第一次输入 123 不在规定范围内,程序回到 do 重新提示输入。第二次输入 6666 符合要求,循环顺利结束。

可能有些小伙伴会觉得奇怪:“合格的密码范围明明是大于等于 1000 且小于等于 9999,为什么 while 条件写的是 password < 1000 || password > 9999 呢?”

其实原因很简单:while 小括号里写的是 “继续循环重输的条件”,而不是 “通过校验的条件”。

当输入的数字小于 1000 或者大于 9999 时,说明密码不合格,条件返回 true,程序就会回到 do 要求重新输入。只有输入了 1000 到 9999 之间的整数,条件返回 false,才会跳出循环往下执行。

此外还要注意,参与末尾 while 条件判断的变量 password 必须定义在 do 的外面。下面这种把变量定义在 do 花括号内部的写法是错误的:

do {
    int password = 0;
    std::cin >> password;
} while (password < 1000 || password > 9999);

这是因为在花括号 {} 内部定义的变量,只在该 {} 内部有效。一旦离开右花括号 },末尾的 while 条件就找不到 password 这个变量了,编译时会直接报错。

上一篇:

下一篇:

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号