第3.4章: while

English

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

这是合法的,但应当谨慎使用。 大多数循环应当使用 { } 以保持清晰。

要点