在 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 这个变量了,编译时会直接报错。
