
一起动脑筋 · 先看一个小故事
女孩把三天读书页数 2、3、4 累加。机器人得记住前一天已经累计多少。
把过程摊开来看
- 开始total = 0
- 第一天0 加 2 得 2
- 第二天2 加 3 得 5
- 第三天5 加 4 得 9
累加变量把上一轮的结果带到下一轮。
把 total 初始化放在循环外,就像准备一张持续使用的统计表。每次更新都在已有结果上继续。
01循环变量为什么一直在变?
for (int i = 1; i <= 3; i++) {
std::cout << i << '\n';
}
第 1 轮
i = 1
第 2 轮
i = 2
第 3 轮
i = 3
每轮结束后的 i++ 修改了同一个循环控制变量的值。
02循环会复制三份 i 吗?
不是。这个例子中不是预先复制三份 i,而是循环控制流反复使用并修改同一个对象。
03循环外的变量怎样累积结果?
int sum = 0;
for (int i = 1; i <= 3; i++) {
sum = sum + i;
}
开始
sum = 0
第 1 轮后
sum = 1
第 2 轮后
sum = 3
第 3 轮后
sum = 6
04循环体里声明变量会怎样?
for (int i = 0; i < 3; i++) {
int x = i * 10;
std::cout << x;
}
x 的作用域只在循环体的大括号内。每次进入这个块时,会开始一个新的 x 对象生命周期;离开这一轮的块后,它的生命周期结束。
05循环结束后还能用 i 吗?
for (int i = 0; i < 3; i++) {
// ...
}
std::cout << i; // 错误
这里的 i 声明在 for 初始化部分,它的作用域属于整个 for 语句,离开循环后就不能再用这个名字。
06怎样追踪多个变量?
可以画一张小表格:
| 轮次 | i | sum |
|---|---|---|
| 开始 | 1 | 0 |
| 第 1 轮后 | 2 | 1 |
| 第 2 轮后 | 3 | 3 |
| 第 3 轮后 | 4 | 6 |
这就是读循环最有效的方法之一。
你已经知道了什么
- 循环不会预先复制很多份变量。
- 循环控制变量会按更新规则不断改变。
- 循环外变量可以在多轮之间保存累积结果。
- 循环体内部变量有自己的作用域和生命周期。
- 用表格追踪变量,是读懂循环的重要方法。
下一篇:循环里面还能放循环吗?
轮到你来试一试
每轮都先令 total = 0,再加当天页数,最后会是 9 吗?
想好了吗?点开看解释
不会,最后只留下第三天的 4。要累计三天,应只在开始时清零。