C++ for 循环

在 C++ 中,for 循环是实际开发中使用频率最高的一种循环语句。相比前面学过的 while 循环,for 循环把控制循环所需的各个要素集中到了一行,结构更加紧凑,特别适合处理循环次数已知的情况。

C++ for 循环语法

大多数循环任务都有明确的初始值、结束条件和每轮更新操作。在 C++ 中,for 循环把这 3 个部分集中写在了同一个小括号里,中间使用两个英文分号(;)隔开。

语法:

for (初始化表达式; 条件表达式; 循环后操作) {
    // 循环执行的代码
}

说明:

for 语句的小括号内部包含以下 3 个部分,它们在语法上都是可选项:

  • 初始化表达式:一般用于定义计数变量的初始值,比如 int i = 1,它在整个循环开始时只执行一次。
  • 条件表达式:进入循环体的判断条件,比如 i <= 5。结果为 true 时进入花括号 {} 执行循环体;结果为 false 时直接结束整个循环。
  • 循环后操作:每执行完一轮循环体 {} 之后执行的更新操作,比如 i++。

初学的小伙伴最容易搞混的地方是:小括号末尾的 “循环后操作” 和花括号 {} 里的循环体到底谁先执行?其实 for 循环的执行顺序是固定的,如下图所示。

for 语句括号内三部分与循环执行流程

第一轮开始时,程序先执行一次 “初始化表达式”,接着判断 “条件表达式”。如果条件为 true,就先执行花括号里的 “循环体”,等循环体执行完毕后,再回头执行小括号末尾的 “循环后操作”。

从第二轮起,程序不再执行初始化表达式,而是不断按照 “条件表达式 → 循环体 → 循环后操作” 的顺序重复运行,直到某一次条件为 false 时退出循环。

C++ for 循环示例

下面我们通过几个实际的例子,来看看 for 循环具体是怎么运行的。

示例 1:递增输出 1 到 5

#include <iostream>

int main() {
    for (int i = 1; i <= 5; i++) {
        std::cout << i << '\n';
    }
    return 0;
}

运行结果如下。

1
2
3
4
5

分析:

在这个例子中,小括号里的 int i = 1 定义了计数变量 i 并将初值设为 1,中间的 i <= 5 是判断条件,末尾的 i++ 表示每轮输出结束后让 i 加 1。具体执行过程如下:

  • 第 1 轮:先执行初始化 int i = 1,判断 1 <= 5 返回 true,进入循环体输出 1,最后执行 i++ 使 i 变为 2。
  • 第 2 轮:不再执行初始化,直接判断 2 <= 5 返回 true,输出 2,最后执行 i++ 使 i 变为 3。
  • 第 3 ~ 5 轮:依次输出 3、4、5,当第 5 轮执行完 i++ 后,i 的值变为 6。
  • 第 6 次判断:判断 6 <= 5 返回 false,直接退出 for 循环。

另外,平时写代码时我们还经常会看到从 0 开始计数的写法,比如 for (int i = 0; i < 5; i++)。此时 i 会依次取 0、1、2、3、4,同样也是循环 5 次。后面学习数组时,因为下标默认从 0 开始,这种写法会大量用到。

示例 2:递减输出 5 到 1

#include <iostream>

int main() {
    for (int i = 5; i >= 1; i--) {
        std::cout << i << '\n';
    }
    return 0;
}

运行结果如下。

5
4
3
2
1

分析:

int i = 5 表示将初始值设为 5,判断条件设为 i >= 1,循环后操作设为 i--。每输出一次 i 就减 1,当减到 0 时 0 >= 1 返回 false 结束循环。小伙伴们可以对照示例 1 的步骤推演一下它的运行过程。

示例 3:计算 1 到 100 的整数之和

#include <iostream>

int main() {
    int sum = 0;

    for (int i = 1; i <= 100; i++) {
        sum += i;
    }

    std::cout << "1 + 2 + 3 + ... + 100 = " << sum << '\n';
    return 0;
}

运行结果如下。

1 + 2 + 3 + ... + 100 = 5050

分析:

对比前面使用 while 循环实现的累加代码,这里计数变量的定义 int i = 1、结束条件 i <= 100 和递增操作 i++ 全部收拢在了 for 的小括号内,花括号里只留下 sum += i; 这一句累加代码,一眼就能看清循环的起止范围。

前面提到,for 小括号里的 3 个部分在语法上都是可以省略的。比如把初始化表达式提到循环外面,下面 2 种方式是等价的:

// 方式 1(推荐)
for (int i = 1; i <= 100; i++) {
    sum += i;
}

// 方式 2
int i = 1;
for (; i <= 100; i++) {
    sum += i;
}

需要注意的是,在方式 2 中,虽然省略了初始化表达式,但小括号里的第一个分号(;)不能删掉,必须保留两个分号来占位。如果把 3 个部分全部省略写成 for (;;),C++ 会默认中间的条件永远为 true,此时就会变成一个死循环。

此外,循环后操作并不局限于每次加 1 或减 1,我们也可以根据需要设置每次增加 2、增加 5 等任意步长。

示例 4:按指定步长输出偶数

#include <iostream>

int main() {
    for (int i = 2; i <= 10; i += 2) {
        std::cout << i << ' ';
    }
    std::cout << '\n';
    return 0;
}

运行结果如下。

2 4 6 8 10

分析:

i += 2 表示每执行完一轮循环体,就让变量 i 增加 2。因此 i 从初始值 2 出发,依次取 2、4、6、8、10,把 10 以内的正偶数全部打印出来。

深入了解 C++ for 循环

掌握基本用法后,我们再来看看 for 循环中两个常用的重点细节:计数变量的有效范围与循环嵌套。

1. 计数变量的有效范围

在实际开发中,我们一般都会像 for (int i = 1; i <= 5; i++) 这样,直接在 for 的小括号里面定义计数变量 i。这样做有一个很实用的好处:在 for 小括号内部定义的变量,只在当前这个 for 循环内部有效。

一旦 for 循环执行完毕,变量 i 就会失效。如果像下面这样在 for 循环的右花括号 } 外面继续使用 i,编译时就会直接报错:

for (int i = 1; i <= 5; i++) {
    std::cout << i << '\n';
}
std::cout << i << '\n';    // 编译报错

正因为当前循环结束后 i 就失效了,我们在同一个函数后面再写其他 for 循环时,依然可以继续定义 int i 作为计数变量,不会发生变量重名冲突。

注意 和 while 循环一样,for 小括号后面千万不要多加分号(;)。写成 for (int i = 1; i <= 5; i++); 时,分号会当作空循环体把循环提前跑完:后面 {} 里如果用到 i 会编译报错,没用到 i 也只会执行一次。

2. for 循环的嵌套

一个 for 循环的花括号内部还可以再放入另一个 for 循环。这种双层循环结构在处理二维数组或打印行列图形时会经常用到,下面我们来看一个例子。

示例 5:for 循环的嵌套

#include <iostream>

int main() {
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            std::cout << i << '-' << j << ' ';
        }
        std::cout << '\n';
    }
    return 0;
}

运行结果如下。

1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3

分析:

阅读嵌套的 for 循环时,只需要抓住一条规律:外层循环每执行一次,内层循环就会从头到尾完整执行一轮。

比如当外层 i 为 1 时,内层 j 会从 1 变到 3 连续执行 3 次,在同一行打印出 “1-1 1-2 1-3”。等内层循环结束后输出换行符,外层 i 再变为 2 进入下一轮。

另外要注意,内层循环的计数变量名不能和外层循环相同,比如外层使用了 i,内层就要换用 j,避免内外两层变量互相干扰。

学到这里,C++ 的 3 种循环语句我们就全部认识了。在实际开发中,如果循环次数在开始前就已经明确,比如固定执行 10 次,我们优先选择 for 循环;如果循环次数不确定,需要依赖运行过程中的条件来决定何时停止,则优先选择 while 循环或 do...while 循环。

上一篇:

下一篇:

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号