3.1 while 与 do-while 循环
循环会重复执行一段代码。while 循环会先检查条件,只要条件成立,C++ 就执行循环体,然后回到开头再次检查条件。
while 的基本结构
一个稳定的 while 循环通常有三个部分:
- 初始值:在循环开始前准备循环变量。
- 条件:决定循环是否继续。
- 更新:在循环体中改变循环变量。
cpp
int i = 1; // 初始值
while (i <= 5) { // 条件
std::cout << "In loop: i = " << i << std::endl;
i++; // 更新
}
std::cout << "After loop: i = " << i << std::endl;输出:
text
In loop: i = 1
In loop: i = 2
In loop: i = 3
In loop: i = 4
In loop: i = 5
After loop: i = 6while 会先判断再执行。这意味着循环体可能执行很多次,也可能一次都不执行。如果忘记更新循环变量,条件会一直为真,循环就会变成死循环。
正在加载概念检查...
累加与平均值
循环经常和累加变量一起使用。下面的程序读取 5 个人的身高,并计算平均身高。
cpp
#include <iostream>
#include <iomanip>
int main() {
int num_people = 5;
double total = 0;
int i = 1;
while (i <= num_people) {
double height;
std::cout << "Enter person " << i << "'s height: ";
std::cin >> height;
total += height;
i++;
}
double average = total / num_people;
std::cout << std::fixed << std::setprecision(2);
std::cout << "Average height: " << average << std::endl;
return 0;
}一次可能的运行:
text
Enter person 1's height: 160.8
Enter person 2's height: 175.2
Enter person 3's height: 171.2
Enter person 4's height: 181.3
Enter person 5's height: 164
Average height: 170.50total += height 会把当前身高加入累计总和。循环结束后,total 保存所有身高的总和。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
循环直到条件变化
当重复次数一开始并不确定时,while 很有用。例如,可以统计一个整数有多少位。
cpp
int num;
std::cin >> num;
if (num < 0) {
num = -num;
}
int digits;
if (num == 0) {
digits = 1;
} else {
digits = 0;
while (num != 0) {
num /= 10;
digits++;
}
}
std::cout << "Digits: " << digits << std::endl;一次可能的运行:
text
Enter an integer: 123
Digits: 3程序单独处理了 0。如果只写 while (num != 0),输入 0 时循环不会执行,位数会错误地变成 0。
正在加载概念检查...
正在加载本节练习...
猜数字游戏
另一种常见的 while 场景,是程序一开始不知道用户需要尝试多少次。猜数字游戏就是经典例子。程序先生成一个随机答案,然后不断读取猜测。如果猜大了,输出提示;如果猜小了,输出另一个提示;猜对时用 break 跳出循环。
注意
标准库的随机数工具会在后面的内容中更系统地介绍。下面的例子使用较现代的 C++ 写法:
std::mt19937 是随机数生成器,std::uniform_int_distribution<int> 负责从 1 到 100 中均匀取整数。cpp
#include <iostream>
#include <random>
int main() {
std::random_device device;
std::mt19937 generator(device());
std::uniform_int_distribution<int> distribution(1, 100);
int answer = distribution(generator);
int cnt = 0;
int num;
while (true) {
std::cout << "Guess a number: ";
std::cin >> num;
cnt++;
if (num > answer) {
std::cout << "Too high" << std::endl;
} else if (num < answer) {
std::cout << "Too low" << std::endl;
} else {
break;
}
}
std::cout << "Correct! You guessed " << cnt << " time(s)." << std::endl;
return 0;
}这里,while (true) 创建了一个条件永远为真的循环。它不会自己停止;循环内部的 break 会在用户猜对时退出。
do-while
C++ 也提供 do-while 循环。它把条件放在循环体之后,所以会先执行一次循环体,再检查条件,也就是说它至少执行一次。注意末尾 while (condition); 后面的分号,很容易漏掉。
cpp
int num;
do {
std::cout << "Enter a positive number: ";
std::cin >> num;
} while (num <= 0);
std::cout << "You entered the positive number: " << num << std::endl;无论用户第一次输入什么,循环体都会先运行一次(至少会问一次);只有当输入不再满足 num <= 0 时,也就是输入正数时,循环才结束。这很适合菜单、输入验证以及其他“至少问一次”的场景。
| 循环 | 是否先检查条件? | 最少执行次数 |
|---|---|---|
while | 是 | 0 |
do-while | 否,先执行循环体 | 1 |
正在加载概念检查...
正在加载本节练习...