在 C++ 中,for 循环是实际开发中使用频率最高的一种循环语句。相比前面学过的 while 循环,for 循环把控制循环所需的各个要素集中到了一行,结构更加紧凑,特别适合处理循环次数已知的情况。
C++ for 循环语法
大多数循环任务都有明确的初始值、结束条件和每轮更新操作。在 C++ 中,for 循环把这 3 个部分集中写在了同一个小括号里,中间使用两个英文分号(;)隔开。
语法:
for (初始化表达式; 条件表达式; 循环后操作) {
// 循环执行的代码
}说明:
for 语句的小括号内部包含以下 3 个部分,它们在语法上都是可选项:
- 初始化表达式:一般用于定义计数变量的初始值,比如
int i = 1,它在整个循环开始时只执行一次。 - 条件表达式:进入循环体的判断条件,比如
i <= 5。结果为true时进入花括号{}执行循环体;结果为false时直接结束整个循环。 - 循环后操作:每执行完一轮循环体
{}之后执行的更新操作,比如i++。
初学的小伙伴最容易搞混的地方是:小括号末尾的 “循环后操作” 和花括号 {} 里的循环体到底谁先执行?其实 for 循环的执行顺序是固定的,如下图所示。

第一轮开始时,程序先执行一次 “初始化表达式”,接着判断 “条件表达式”。如果条件为 true,就先执行花括号里的 “循环体”,等循环体执行完毕后,再回头执行小括号末尾的 “循环后操作”。
从第二轮起,程序不再执行初始化表达式,而是不断按照 “条件表达式 → 循环体 → 循环后操作” 的顺序重复运行,直到某一次条件为 false 时退出循环。
C++ for 循环示例
下面我们通过几个实际的例子,来看看 for 循环具体是怎么运行的。
示例 1:递增输出 1 到 5
#include <iostream>
int main() {
for (int i = 1; i <= 5; i++) {
std::cout << i << '\n';
}
return 0;
}运行结果如下。
1
2
3
4
5分析:
在这个例子中,小括号里的 int i = 1 定义了计数变量 i 并将初值设为 1,中间的 i <= 5 是判断条件,末尾的 i++ 表示每轮输出结束后让 i 加 1。具体执行过程如下:
- 第 1 轮:先执行初始化
int i = 1,判断1 <= 5返回true,进入循环体输出 1,最后执行i++使i变为 2。 - 第 2 轮:不再执行初始化,直接判断
2 <= 5返回true,输出 2,最后执行i++使i变为 3。 - 第 3 ~ 5 轮:依次输出 3、4、5,当第 5 轮执行完
i++后,i的值变为 6。 - 第 6 次判断:判断
6 <= 5返回false,直接退出for循环。
另外,平时写代码时我们还经常会看到从 0 开始计数的写法,比如 for (int i = 0; i < 5; i++)。此时 i 会依次取 0、1、2、3、4,同样也是循环 5 次。后面学习数组时,因为下标默认从 0 开始,这种写法会大量用到。
示例 2:递减输出 5 到 1
#include <iostream>
int main() {
for (int i = 5; i >= 1; i--) {
std::cout << i << '\n';
}
return 0;
}运行结果如下。
5
4
3
2
1分析:
int i = 5 表示将初始值设为 5,判断条件设为 i >= 1,循环后操作设为 i--。每输出一次 i 就减 1,当减到 0 时 0 >= 1 返回 false 结束循环。小伙伴们可以对照示例 1 的步骤推演一下它的运行过程。
示例 3:计算 1 到 100 的整数之和
#include <iostream>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
std::cout << "1 + 2 + 3 + ... + 100 = " << sum << '\n';
return 0;
}运行结果如下。
1 + 2 + 3 + ... + 100 = 5050分析:
对比前面使用 while 循环实现的累加代码,这里计数变量的定义 int i = 1、结束条件 i <= 100 和递增操作 i++ 全部收拢在了 for 的小括号内,花括号里只留下 sum += i; 这一句累加代码,一眼就能看清循环的起止范围。
前面提到,for 小括号里的 3 个部分在语法上都是可以省略的。比如把初始化表达式提到循环外面,下面 2 种方式是等价的:
// 方式 1(推荐)
for (int i = 1; i <= 100; i++) {
sum += i;
}
// 方式 2
int i = 1;
for (; i <= 100; i++) {
sum += i;
}需要注意的是,在方式 2 中,虽然省略了初始化表达式,但小括号里的第一个分号(;)不能删掉,必须保留两个分号来占位。如果把 3 个部分全部省略写成 for (;;),C++ 会默认中间的条件永远为 true,此时就会变成一个死循环。
此外,循环后操作并不局限于每次加 1 或减 1,我们也可以根据需要设置每次增加 2、增加 5 等任意步长。
示例 4:按指定步长输出偶数
#include <iostream>
int main() {
for (int i = 2; i <= 10; i += 2) {
std::cout << i << ' ';
}
std::cout << '\n';
return 0;
}运行结果如下。
2 4 6 8 10分析:
i += 2 表示每执行完一轮循环体,就让变量 i 增加 2。因此 i 从初始值 2 出发,依次取 2、4、6、8、10,把 10 以内的正偶数全部打印出来。
深入了解 C++ for 循环
掌握基本用法后,我们再来看看 for 循环中两个常用的重点细节:计数变量的有效范围与循环嵌套。
1. 计数变量的有效范围
在实际开发中,我们一般都会像 for (int i = 1; i <= 5; i++) 这样,直接在 for 的小括号里面定义计数变量 i。这样做有一个很实用的好处:在 for 小括号内部定义的变量,只在当前这个 for 循环内部有效。
一旦 for 循环执行完毕,变量 i 就会失效。如果像下面这样在 for 循环的右花括号 } 外面继续使用 i,编译时就会直接报错:
for (int i = 1; i <= 5; i++) {
std::cout << i << '\n';
}
std::cout << i << '\n'; // 编译报错正因为当前循环结束后 i 就失效了,我们在同一个函数后面再写其他 for 循环时,依然可以继续定义 int i 作为计数变量,不会发生变量重名冲突。
注意 和 while 循环一样,for 小括号后面千万不要多加分号(;)。写成 for (int i = 1; i <= 5; i++); 时,分号会当作空循环体把循环提前跑完:后面 {} 里如果用到 i 会编译报错,没用到 i 也只会执行一次。
2. for 循环的嵌套
一个 for 循环的花括号内部还可以再放入另一个 for 循环。这种双层循环结构在处理二维数组或打印行列图形时会经常用到,下面我们来看一个例子。
示例 5:for 循环的嵌套
#include <iostream>
int main() {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
std::cout << i << '-' << j << ' ';
}
std::cout << '\n';
}
return 0;
}运行结果如下。
1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3分析:
阅读嵌套的 for 循环时,只需要抓住一条规律:外层循环每执行一次,内层循环就会从头到尾完整执行一轮。
比如当外层 i 为 1 时,内层 j 会从 1 变到 3 连续执行 3 次,在同一行打印出 “1-1 1-2 1-3”。等内层循环结束后输出换行符,外层 i 再变为 2 进入下一轮。
另外要注意,内层循环的计数变量名不能和外层循环相同,比如外层使用了 i,内层就要换用 j,避免内外两层变量互相干扰。
学到这里,C++ 的 3 种循环语句我们就全部认识了。在实际开发中,如果循环次数在开始前就已经明确,比如固定执行 10 次,我们优先选择 for 循环;如果循环次数不确定,需要依赖运行过程中的条件来决定何时停止,则优先选择 while 循环或 do...while 循环。
