for 循环把初始化、条件判断、更新三步整合到一行,是循环次数已知时最简洁、最常用的写法,本节还将学习循环嵌套的用法。
5.3
for 循环把初始化、条件判断、更新三步整合到一行,是循环次数已知时最简洁、最常用的写法。
for 循环的初始化、条件、更新都可以省略。省略条件时,循环变成无限循环:for (;;) { ... },与 while (true) 效果相同。需要搭配 break 才能退出。三段式结构不代表每一段只能写一件事。for 循环支持用逗号同时初始化/更新多个变量,也可以完全省略某一段:
| 1 | // 同时用两个变量,一个递增一个递减 |
| 2 | for (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 | // 初始化写在外面,循环里只留条件和更新 |
| 8 | int i = 0; |
| 9 | for (; i < 5; i++) // 初始化留空 |
| 10 | { |
| 11 | cout << i; |
| 12 | } |
, 分隔多个语句时,用的是"逗号运算符",语义是"依次执行",和函数调用中用逗号分隔参数是两个完全不同的东西。这个写法仅限 for 的初始化和更新部分好用,条件部分用逗号则含义不同,不建议使用。循环内部可以再嵌套循环,常用于处理二维数据(如矩阵、九九乘法表)。外层循环每执行一次,内层循环完整跑一遍。
| 1 | for (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 | } |
i(应该用 j),导致内层的 i++ 意外修改了外层正在用的 i,扰乱外层循环的计数。养成"外层用 i,内层用 j,再内层用 k"的命名习惯,能大幅减少这类失误。把本节内容汇总成几条最容易踩坑的规则:
i < n(从0开始)还是 i <= n(从1开始),一定要想清楚起始值和终止条件是否匹配,这是最常见的"多循环一次"或"少循环一次"的错误来源。for (int i = 0; ...) 里声明的 i,只在这个 for 循环内部有效,循环结束后就不能再访问。如果需要在循环外使用最终的 i 值,要提前在循环外声明。