Skip to content

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 循环的严格顺序:

  1. 首先执行 int i = 1只在刚开始执行一次!)。
  2. 判断 i <= 5 是否成立。如果成立,进入大括号执行代码;如果不成立,直接结束整个循环。
  3. 大括号里的代码执行完毕后,回头执行 i++
  4. 再次回到第 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; // 合法,输出 11

4. 动手实践

md
1. 打开左下角的代码沙盒。
2. 试着用 `for` 循环,打印出 1 到 50 之间所有的**偶数**
   *(挑战:除了在循环里使用 `if` 判断以外,你能通过修改 `for` 循环的“第三步状态更新”,用更少的步骤直接跳着打印偶数吗?)*
💻 运行代码

C++ 在线评测沙盒

📥 标准输入 (cin):
📤 终端输出 (cout):