3.2 循环语句
循环语句用于重复执行一段代码,直到某个条件不再满足。C++ 提供了三种基本循环结构:while、do-while 和 for,以及 C++11 引入的范围 for 循环。
while 循环
Section titled “while 循环”while 循环在每次执行循环体之前检查条件。如果条件为 true,执行循环体;否则跳出循环。
while (条件) { // 循环体}示例——输出 1 到 5:
int i = 1;
while (i <= 5) { std::cout << i << " "; ++i;}std::cout << std::endl;// 输出:1 2 3 4 5执行流程:
- 检查
i <= 5是否为true - 如果是,执行循环体(输出
i,然后i加 1) - 回到步骤 1
- 当
i变为 6 时,条件为false,循环结束
{% hint style=“warning” %}
如果条件永远为 true,循环将永不停止,形成死循环(Infinite Loop)。编写循环时务必确保循环变量在循环体中被正确更新,使条件最终变为 false。
{% endhint %}
do-while 循环
Section titled “do-while 循环”do-while 与 while 的区别在于:它先执行一次循环体,再检查条件。这保证了循环体至少执行一次。
do { // 循环体} while (条件); // 注意末尾的分号典型用途是需要先执行再判断的场景,例如输入验证:
int number;
do { std::cout << "请输入一个正整数:"; std::cin >> number;} while (number <= 0);
std::cout << "你输入的是 " << number << std::endl;如果用户输入了负数或零,程序会反复提示直到输入正整数为止。
for 循环
Section titled “for 循环”for 循环将初始化、条件检查和迭代操作集中在一行,结构紧凑,特别适合已知循环次数的场景。
for (初始化; 条件; 迭代) { // 循环体}示例——输出 1 到 10 的和:
int sum = 0;
for (int i = 1; i <= 10; ++i) { sum += i;}
std::cout << "1 到 10 的和:" << sum << std::endl;// 输出:1 到 10 的和:55执行顺序:
- 执行初始化(
int i = 1),仅在循环开始前执行一次 - 检查条件(
i <= 10),为false则跳出循环 - 执行循环体
- 执行迭代(
++i) - 回到步骤 2
for 循环的灵活性
Section titled “for 循环的灵活性”for 的三个部分都可以省略:
// 省略初始化(变量在外部定义)int i = 0;for (; i < 10; ++i) { /* ... */ }
// 省略条件(等同于 while(true),需要在循环体内用 break 退出)for (int i = 0; ; ++i) { if (i >= 10) break;}
// 全部省略:无限循环for (;;) { // 等同于 while (true)}多变量 for 循环
Section titled “多变量 for 循环”初始化和迭代部分可以使用逗号分隔多个表达式:
for (int i = 0, j = 10; i < j; ++i, --j) { std::cout << "i=" << i << " j=" << j << std::endl;}范围 for 循环
Section titled “范围 for 循环”C++11 引入了范围 for 循环(Range-based for Loop),用于遍历容器或数组中的每个元素,语法简洁且不易出错:
for (类型 变量 : 容器) { // 对每个元素执行操作}示例——遍历数组:
int numbers[] = {10, 20, 30, 40, 50};
for (int n : numbers) { std::cout << n << " ";}std::cout << std::endl;// 输出:10 20 30 40 50配合 auto 可以省去手动指定类型:
for (auto n : numbers) { std::cout << n << " ";}如果需要在循环中修改元素,使用引用(Reference):
for (auto& n : numbers) { n *= 2; // 将每个元素翻倍}如果只是读取元素,使用 const 引用可以避免不必要的拷贝(对于大型对象尤其重要):
for (const auto& n : numbers) { std::cout << n << " ";}范围 for 循环适用于数组、std::vector、std::string 等所有提供 begin() 和 end() 的容器。后续章节会频繁使用这种写法。
循环可以嵌套使用。经典的例子是输出九九乘法表:
for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= i; ++j) { std::cout << j << "×" << i << "=" << i * j << "\t"; } std::cout << std::endl;}嵌套循环的总执行次数是各层循环次数的乘积。外层循环执行 m 次,内层循环执行 n 次,循环体总共执行 m × n 次。嵌套层级过多时应考虑是否可以简化逻辑。
如何选择循环类型
Section titled “如何选择循环类型”| 场景 | 推荐 |
|---|---|
| 已知循环次数 | for |
| 遍历容器/数组 | 范围 for |
| 循环次数未知,先判断再执行 | while |
| 至少执行一次 | do-while |