Skip to content

C++ 循环类型

循环(Loops)是控制流结构(control flow structures),允许你重复执行一段代码块(block of code)。这在你需要多次执行同一操作时至关重要,例如,处理集合中的每个元素,或重复执行某个动作直到满足特定条件。

没有循环,代码将按顺序逐条执行。循环改变了这种流程,使得基于指定条件进行重复成为可能。

典型的循环涉及:

  • 初始化 (Initialization): 设置循环所需的任何变量(例如,计数器)。
  • 条件 (Condition): 在每次迭代之前(有时之后)评估的表达式。如果为真,循环体(loop body)执行;如果为假,循环终止。
  • 循环体 (Loop Body): 重复执行的代码块。
  • 更新 (Update): 在每次迭代后执行的操作,通常修改与条件相关的变量(例如,递增计数器)。

C++ 提供了几种类型的循环:

循环类型描述
while 循环只要给定条件为真,就重复执行代码块。在每次迭代之前测试条件。如果条件初始为假,则循环体永不执行。
for 循环一种紧凑的循环结构,通常在已知或可以预先确定迭代次数时使用。它的头部(header)明确包含初始化、条件和更新表达式(initialization, condition, and update expressions)。
do...while 循环类似于 while 循环,但在循环体执行之后测试条件。这保证循环体至少执行一次,即使条件初始为假。
基于范围的 for 循环 (C++11)提供了一种简化的语法,用于迭代范围内的所有元素,例如标准容器(standard containers)(std::vector、std::array)、C 风格数组或初始化列表(initializer lists)。在现代 C++ 中,这通常是迭代集合(iterating over collections)时的首选循环类型。
嵌套循环 (Nested loops)你可以将一个循环放在另一个循环内部(例如,一个 for 循环在一个 while 循环内部)。这常用于处理多维数据结构(multi-dimensional data structures)等任务。

循环控制语句(Loop control statements)允许你改变循环内的正常执行流程:

控制语句描述
break 语句立即终止其所在的最内层循环(while、for、do...while)或 switch 语句。执行转移到紧跟在终止的循环/switch 之后的语句。
continue 语句跳过当前最内层循环迭代的剩余部分,并直接进入下一次迭代的条件检查(对于 for 循环,还会执行更新步骤)。
goto 语句无条件地将控制转移到同一函数内的标记语句处。在现代 C++ 中,强烈不建议使用 goto,因为它会使代码难以阅读、理解和维护。结构化控制流(structured control flow)(循环、条件语句、函数)几乎总是更好的替代方案。

示例:break 和 continue

#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, -2, 3, 0, 5, -6, 7};
std::cout << "Processing numbers:" << std::endl;
for (int num : numbers) {
if (num < 0) {
std::cout << " (Skipping negative number: " << num << ")" << std::endl;
continue; // 跳到下一个数字
}
if (num == 0) {
std::cout << " (Encountered zero, stopping loop)" << std::endl;
break; // 完全退出循环
}
// 这部分只在找到零之前对正非零数字执行
std::cout << " Processing positive number: " << num << std::endl;
}
std::cout << "Loop finished." << std::endl;
return 0;
}

输出:

Processing numbers:
Processing positive number: 1
(Skipping negative number: -2)
Processing positive number: 3
(Encountered zero, stopping loop)
Loop finished.

无限循环(An infinite loop)是指其条件永远不会变为假的循环,导致它永远运行(或直到手动中断)。虽然有时是故意的(例如在嵌入式系统或等待输入的服务器进程中),但它们通常是 Bug。

常见的创建(通常是意外创建)无限循环的方式:

  • while(true): 明确设置永远为真的条件。
  • for(;;): 省略 for 循环头部的所有三个部分(初始化、条件、更新)会创建一个无限循环。
  • 逻辑错误: 在 while 或 do...while 循环中忘记更新循环变量(loop variable),导致条件永远不会改变。
// 故意创建无限循环结构的示例
// (常用于事件循环或服务器主循环)
#include <iostream>
int main() {
std::cout << "Entering infinite loop (Press Ctrl+C to exit)..." << std::endl;
for (;;) { // Or while(true)
// 执行一些重复任务,例如检查网络连接
// 通常包含在某些条件下中断或退出的方式
// 或依赖外部终止(例如 Ctrl+C)
}
// 在这个简单示例中,这行代码永远不会执行
std::cout << "Loop exited (should not happen here)." << std::endl;
return 0;
}

注意:你通常可以通过按下 Ctrl + C 来终止在控制台中运行的无限循环。