Skip to content

3.2 循环语句

循环语句用于重复执行一段代码,直到某个条件不再满足。C++ 提供了三种基本循环结构:whiledo-whilefor,以及 C++11 引入的范围 for 循环。

while 循环在每次执行循环体之前检查条件。如果条件为 true,执行循环体;否则跳出循环。

while (条件) {
// 循环体
}

示例——输出 1 到 5:

int i = 1;
while (i <= 5) {
std::cout << i << " ";
++i;
}
std::cout << std::endl;
// 输出:1 2 3 4 5

执行流程:

  1. 检查 i <= 5 是否为 true
  2. 如果是,执行循环体(输出 i,然后 i 加 1)
  3. 回到步骤 1
  4. i 变为 6 时,条件为 false,循环结束

{% hint style=“warning” %} 如果条件永远为 true,循环将永不停止,形成死循环(Infinite Loop)。编写循环时务必确保循环变量在循环体中被正确更新,使条件最终变为 false。 {% endhint %}

do-whilewhile 的区别在于:它先执行一次循环体,再检查条件。这保证了循环体至少执行一次。

do {
// 循环体
} while (条件); // 注意末尾的分号

典型用途是需要先执行再判断的场景,例如输入验证:

int number;
do {
std::cout << "请输入一个正整数:";
std::cin >> number;
} while (number <= 0);
std::cout << "你输入的是 " << number << std::endl;

如果用户输入了负数或零,程序会反复提示直到输入正整数为止。

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

执行顺序:

  1. 执行初始化int i = 1),仅在循环开始前执行一次
  2. 检查条件i <= 10),为 false 则跳出循环
  3. 执行循环体
  4. 执行迭代++i
  5. 回到步骤 2

for 的三个部分都可以省略:

// 省略初始化(变量在外部定义)
int i = 0;
for (; i < 10; ++i) { /* ... */ }
// 省略条件(等同于 while(true),需要在循环体内用 break 退出)
for (int i = 0; ; ++i) {
if (i >= 10) break;
}
// 全部省略:无限循环
for (;;) {
// 等同于 while (true)
}

初始化和迭代部分可以使用逗号分隔多个表达式:

for (int i = 0, j = 10; i < j; ++i, --j) {
std::cout << "i=" << i << " j=" << j << std::endl;
}

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::vectorstd::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 次。嵌套层级过多时应考虑是否可以简化逻辑。

场景推荐
已知循环次数for
遍历容器/数组范围 for
循环次数未知,先判断再执行while
至少执行一次do-while