← 目录 / 第五章 · 循环结构 / 5.3 for 循环

5.3 for 循环

for 循环把初始化、条件判断、更新三步整合到一行,是循环次数已知时最简洁、最常用的写法,本节还将学习循环嵌套的用法。

for 循环

for 循环把初始化、条件判断、更新三步整合到一行,是循环次数已知时最简洁、最常用的写法。

5.3.1 for 循环的三段式结构

for  ( int i = 1 i <= 10 i++ )
① 初始化(只执行一次)
② 条件(每轮都判断)
④ 更新(每轮执行完后)

5.3.2 执行顺序

1初始化
2判断条件
3执行循环体
4执行更新
回到 ②,直到条件为 false
📌
三部分均可省略:for 循环的初始化、条件、更新都可以省略。省略条件时,循环变成无限循环:for (;;) { ... },与 while (true) 效果相同。需要搭配 break 才能退出。

5.3.3 灵活的写法

三段式结构不代表每一段只能写一件事。for 循环支持用逗号同时初始化/更新多个变量,也可以完全省略某一段:

C++ · for 循环的灵活写法
1// 同时用两个变量,一个递增一个递减
2for (int i = 0, j = 9; i < j; i++, j--)
3{
4 cout << i << "-" << j << " "; // 0-9 1-8 2-7 3-6 4-5
5}
6
7// 初始化写在外面,循环里只留条件和更新
8int i = 0;
9for (; i < 5; i++) // 初始化留空
10{
11 cout << i;
12}
📖
逗号运算符:初始化和更新部分用逗号 , 分隔多个语句时,用的是"逗号运算符",语义是"依次执行",和函数调用中用逗号分隔参数是两个完全不同的东西。这个写法仅限 for 的初始化和更新部分好用,条件部分用逗号则含义不同,不建议使用。

5.3.4 嵌套循环

循环内部可以再嵌套循环,常用于处理二维数据(如矩阵、九九乘法表)。外层循环每执行一次,内层循环完整跑一遍。

外层循环 — 控制行 i: 1→9
for (int i = 1; i <= 9; i++)
内层循环 — 控制列 j: 1→i
for (int j = 1; j <= i; j++)
printf("%d×%d=%-3d", j, i, i*j); // 输出每格
C++ · 九九乘法表
1for (int i = 1; i <= 9; i++) // 外层:控制行
2{
3 for (int j = 1; j <= i; j++) // 内层:控制列
4 {
5 printf("%d×%d=%-3d", j, i, i*j); // %-3d:左对齐占3位
6 }
7 cout << endl; // 每行结束换行
8}
📊
时间复杂度提醒:嵌套循环的执行次数是各层循环次数的乘积。例如两层各循环 n 次,总共执行约 n² 次。在竞赛中,如果 n = 10⁵,两层嵌套(10¹⁰ 次)会直接超时,需要更优算法。
💡
内外层变量名不要搞混:嵌套循环最经典的笔误是内层循环也写成了 i(应该用 j),导致内层的 i++ 意外修改了外层正在用的 i,扰乱外层循环的计数。养成"外层用 i,内层用 j,再内层用 k"的命名习惯,能大幅减少这类失误。

5.3.5 常见陷阱与易错点

把本节内容汇总成几条最容易踩坑的规则:

1
边界条件写错(< 和 <= 混淆):想循环 n 次,写成 i < n(从0开始)还是 i <= n(从1开始),一定要想清楚起始值和终止条件是否匹配,这是最常见的"多循环一次"或"少循环一次"的错误来源。
2
循环变量的作用域:for (int i = 0; ...) 里声明的 i,只在这个 for 循环内部有效,循环结束后就不能再访问。如果需要在循环外使用最终的 i 值,要提前在循环外声明。
3
内外层循环变量重名:嵌套循环中,如果内层不小心也用了外层正在用的变量名,会覆盖外层的计数,导致外层循环提前结束或次数出错。务必确保每一层用的变量名互不相同。
4
嵌套层数过多导致超时:嵌套循环的总执行次数是各层次数相乘,数据规模稍大就可能远超时间限制(见上方时间复杂度提醒)。写代码前先估算一下总执行次数,如果数量级达到 10⁸ 以上就要考虑换算法了。