Appearance
10. for 循环:最受 OIer 欢迎的循环
前置学习:while 循环
在实际编写算法题时,我们往往需要进行有明确次数的循环(比如:读入 $N$ 个数字,或者从 1 遍历到 100)。 虽然用 while 完全可以胜任,但因为 while 的“三要素”散落在代码的各个角落,一不小心就会漏写导致死循环。
于是,C++ 提供了专门为这类场景打造的超级语法:for 循环。
1. for 循环的标准结构
for 循环强制你把循环三要素全部写在一行里,极大降低了犯错的概率。
cpp
// 语法:for (第一步初始状态; 第二步循环条件; 第三步状态更新)
for (int i = 1; i <= 5; i++) {
cout << i << endl;
}电脑执行 for 循环的严格顺序:
- 首先执行
int i = 1(只在刚开始执行一次!)。 - 判断
i <= 5是否成立。如果成立,进入大括号执行代码;如果不成立,直接结束整个循环。 - 大括号里的代码执行完毕后,回头执行
i++。 - 再次回到第 2 步,以此类推。
2. for 和 while 的终极对比
我们可以把同一个逻辑,用两种循环写出来对比一下:
用 while 打印 1 到 3:
cpp
int i = 1; // 1. 初始状态(写在外面)
while (i <= 3) { // 2. 循环条件
cout << i;
i++; // 3. 状态更新(容易忘)
}用 for 打印 1 到 3(OIer 首选):
cpp
for (int i = 1; i <= 3; i++) { // 三要素全部集中在这里,一目了然
cout << i;
}3. ⚠️ 竞赛考点:变量 i 的生命周期 (作用域)
在 for 循环的括号里定义的变量 i,它是一个局部变量。 它的生命周期只存在于这个 for 循环的大括号内部。一旦循环结束,这个 i 就会被系统无情地销毁!
cpp
for (int i = 1; i <= 10; i++) {
// 这里使用 i 完全没问题
}
// 错误!出了 for 循环的势力范围,电脑已经不认识 i 是谁了
cout << i << endl;如果要在循环结束后依然能使用这个计数器,必须把 i 的声明提前到循环外面:
cpp
int i; // 声明在外
for (i = 1; i <= 10; i++) {
// ...
}
cout << "循环结束后,i 的值变成了:" << i << endl; // 合法,输出 114. 动手实践
md
1. 打开左下角的代码沙盒。
2. 试着用 `for` 循环,打印出 1 到 50 之间所有的**偶数**。
*(挑战:除了在循环里使用 `if` 判断以外,你能通过修改 `for` 循环的“第三步状态更新”,用更少的步骤直接跳着打印偶数吗?)*