重复执行 语句,直至 条件 的值变为 false。检测发生于每次重复之前。

语法

属性(可选) while ( 条件 ) 语句
属性(C++11) - 任何数量的属性
条件 - 任何能按语境转换为 bool 的表达式,或带花括号或等号初始化器的单个变量的声明。每次重复之前求值此表达式,而若它产出 false,则退出循环。若此为声明,则每次重复之前求值其初始化器,且若被声明变量的值转换为 false,则退出循环。
语句 - 任何语句,典型地为复合语句,它是循环体。

解释

若 语句 是单条语句(非复合语句),则声明于其中的变量的作用域被限制在 while 循环内,如同它是复合语句一样,换言之

  1. while (--x >= 0)
  2. int i;
  3. // i 离开作用域

与下面的相同

  1. while (--x >= 0) {
  2. int i;
  3. } // i 离开作用域

若 条件 是如 T t = x 这样的声明,则被声明变量仅在循环体内处于作用域中,而且在每次重复中销毁并重新创建,换言之,这种 while 循环等价于

  1. label:
  2. { // 循环作用域的开始
  3. T t = x;
  4. if (t) {
  5. statement
  6. goto label; // 调用 t 的析构函数
  7. }
  8. }

若循环的执行必须在某点终止,则可以 break 语句作为终止语句。

若循环需要在循环体结尾继续,则可以 continue 语句作为快捷方式。

注意

作为 C++ 向前进展保证的一部分,若无可观察行为(不调用 I/O 函数,访问 volatile 对象,或进行原子或同步操作)的循环不会终止,则其行为未定义。允许编译器移除这种循环。

关键词

while

示例

运行此代码

  1. #include <iostream>
  2.  
  3. int main() {
  4. // 带单语句的 while 循环
  5. int i = 0;
  6. while (i < 10)
  7. i++;
  8. std::cout << i << '\n';
  9.  
  10. // 带复合语句的 while 循环
  11. int j = 2;
  12. while (j < 9) {
  13. std::cout << j << ' ';
  14. j += 2;
  15. }
  16. std::cout << '\n';
  17.  
  18. // 带声明条件的 while 循环
  19. char cstr[] = "Hello";
  20. int k = 0;
  21. while (char c = cstr[k++])
  22. std::cout << c;
  23. std::cout << '\n';
  24. }

输出:

  1. 10
  2. 2 4 6 8
  3. Hello