第3.4章: while
while 语句
while 语句在条件为真时重复执行一条语句。
while (cond)
;
这里循环体只是一个空语句(;)。
这个循环反复检查条件,但什么也不做。
始终使用 { }
与 if 一样,初学者应当始终使用花括号。
不加花括号时,只有一条语句属于循环。
❌ 错误(只有一条语句在循环内)
while (x < 5)
x = x + 1;
print("looping\n"); // this is NOT inside the loop
✔️ 正确
while (x < 5) {
x = x + 1;
print("looping\n");
}
花括号让哪些语句被重复一目了然。
死循环
死循环(无限循环)是指条件永远为真的循环。
while (true) {
;
}
这个循环永不结束。 它在底层代码、服务器或事件循环中有时很有用,但初学者应当谨慎使用。
你也可以用初始化语句写出无限循环:
while (auto flag = true; flag) {
;
}
初始化语句
while 循环可以在条件之前声明变量。
C++ 允许两种不同的写法。
该变量只存在于循环内部。
形式 1
::std::uint_least32_t a{3};
::std::uint_least32_t b{9};
while (::std::int_least32_t sum = a + b) { // condition is: sum != 0
println("sum != 0, a=", a, ", b=", b, ", sum=", sum);
break; // avoid infinite loop in this example
}
在这种形式中,条件就是该变量是否非零。
形式 2
while (auto sum = a + b; sum > 10) {
println("sum > 10, a=", a, ", b=", b, ", sum=", sum);
break; // avoid infinite loop in this example
}
在这种形式中,先声明变量,然后再检查一个独立的条件。
两种形式下,变量(sum)都会在每次循环迭代结束时被销毁。
示例:对 [0, 100) 求和
一个常见的模式是在某个范围上循环。
在 C++ 中,只要可能,我们更愿意用 != 而不是 < 来写条件。
::std::uint_least32_t i{};
::std::uint_least32_t sum{};
while (i != 100) { // preferred over i < 100
sum = sum + i;
++i;
}
println("sum of [0,100) = ", sum);
使用 != 可避免差一错误,并让循环更清晰。
示例:只对 3 的倍数求和
你可以把 while 与 if 结合来筛选值。
::std::uint_least32_t i{};
::std::uint_least32_t sum{};
while (i != 100) {
if (i % 3 == 0) {
sum = sum + i;
}
++i;
}
println("sum of multiples of 3 in [0,100) = ", sum);
这个模式非常常见:在某个范围上循环,并用 if 选出需要的值。
风格说明
在 C++ 中,我们一般更倾向于:
- 循环到固定上限时,用
!=而不是< - 用
<而不是>,因为它读起来更自然,也更不容易出错
这些约定让循环更易读、更不容易出错。
空循环体循环
有时所有工作都在条件或自增中完成。 这种情况下,循环体是有意为空的:
while (++x < 10)
; // empty body
这是合法的,但应当谨慎使用。
大多数循环应当使用 { } 以保持清晰。
要点
- while 重复一条语句:不加花括号时,只有一条语句在循环内。
- 初始化语句:
while (init)与while (init; cond)两种形式声明的变量只在循环内有效。 - 死循环:
while(true)永不结束。 - 范围循环:固定上限时优先用
!=。 - 筛选:把
while与if结合以选出需要的值。 - 空循环体:允许,但应当有意识地、克制地使用。
- 清晰性:始终使用
{ }以避免出错。