第3.5章: for
for 语句
for 循环是重复执行语句的另一种方式。
它由三部分组成:
for (init; cond; step) {
body
}
- 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++ 中,我们一般更倾向于:
- 循环到固定上限时,用
!=而不是< - 用
<而不是>,因为它读起来更自然
这些约定让循环更易读、更不容易出错。
要点
- for 有四个部分:初始化语句、条件、步进,以及循环体语句。
- 初始化语句:两种变量声明形式都允许。
- 范围循环:固定上限时优选
!=。 - 筛选:把
for与if结合以选出需要的值。 - 死循环:
for(;;)永不结束。 - 空循环体:允许,但应当有意识地使用。
- 清晰性:始终使用
{ }以避免出错。