第3.5章: for

English

for 语句

for 循环是重复执行语句的另一种方式。 它由三部分组成:


for (init; cond; step) {
    body
}

和之前一样,如果循环体什么也不做,; 可以是空语句。


        ┌───────────────┐
        │     init       │   (runs once)
        └───────┬───────┘
                │
                ▼
        ┌───────────────┐
┌────▶│     cond       │─── false ───▶ loop ends
│     └───────┬───────┘
│             │ true
│             ▼
│     ┌───────────────┐
│     │     body       │
│     └───────┬───────┘
│             │
│             ▼
│     ┌───────────────┐
└─────│      step      │
        └───────┬───────┘
                │
                └─────────────── back to cond

始终使用 { }

与 if 和 while 一样,初学者应当始终使用花括号。

❌ 错误


for (i = 0; i != 5; ++i)
    print(i, "\n");
    print("done\n");   // NOT inside the loop

✔️ 正确


for (i = 0; i != 5; ++i) {
    print(i, "\n");
}
print("done\n");

初始化语句

for 循环可以在 init 部分声明变量。


for (::std::int_least32_t i = 0; i != 5; ++i) {
    println("i=", i);
}

该变量(i)只存在于循环内部。

示例:对 [0, 100) 求和

for 循环非常适合在某个范围上迭代。


::std::uint_least32_t sum{};

for (::std::uint_least32_t i{}; i != 100; ++i) {
    sum = sum + i;
}

println("sum of [0,100) = ", sum);

和之前一样,固定上限时我们优先用 !=。

示例:只对 3 的倍数求和

你可以把 for 与 if 结合来筛选值。


::std::uint_least32_t sum{};

for (::std::uint_least32_t i{}; i != 100; ++i) {
    if (i % 3 == 0) {
        sum = sum + i;
    }
}

println("sum of multiples of 3 in [0,100) = ", sum);

死循环

死循环(无限循环)可以用 for 写出:


for (;;) {
    ;
}

三个部分全部省略,因此没有任何东西能让循环停下来。

根据 C++ 标准,这种形式的行为等同于:


while (true) {
    ;
}

除非循环体内有东西跳出去,否则两个循环都会永远运行。

空循环体循环

有时所有工作都在 step 表达式中完成:


for (::std::uint_least32_t i{}; i != 10; ++i)
    ;   // empty body

这是合法的,但应当谨慎使用。

风格说明

在 C++ 中,我们一般更倾向于:

这些约定让循环更易读、更不容易出错。

要点