while
循环
来自cppreference.com
有条件地重复执行某条语句。
语法
属性 (可选) while ( 条件 ) 语句
|
|||||||||
属性 | - | (C++11 起) 任意数量的属性 |
条件 | - | 条件 |
语句 | - | 任意语句(典型情况下是复合语句) |
条件
|
(C++26 起) |
- 如果在语法上它既可以解析为表达式,也可解析为结构化绑定声明以外的 (C++26 起)声明,那么它会作为后者处理。
当控制抵达条件 时,条件会产生一个值,该值用于确定是否会执行语句。
表达式
如果条件 是表达式,那么它产生的值就是该表达式按语境转换到 bool 的值。如果该转换非良构,那么程序也非良构。
声明
如果条件 是简单声明,那么它产生的值是决定变量(见下文)按语境转换到 bool 的值。如果该转换非良构,那么程序也非良构。
非结构化绑定声明
声明具有以下限制:
- 它只有一个声明符。
- 该声明符不能指定函数或数组。
- 该声明符必须有一个语法 (3) 以外的初始化器。
- 它的声明说明符序列只能包含类型说明符和 constexpr (C++11 起),并且不能定义类或枚举。
这种声明的决定变量就是它声明的变量。
结构化绑定声明声明具有以下限制: 这种声明的决定变量是由声明引入的虚设变量 e。 |
(C++26 起) |
解释
while 语句等价于
/* 标号 */ :
|
|||||||||
如果条件 是声明,那么它声明的变量会在循环的每次迭代中都被销毁和创建。
如果需要在语句 中结束循环,那么可以使用 break 语句作为终止语句。
如果需要在语句 中结束当前迭代,那么可以使用 continue 语句作为快捷方式。
注解
无论语句 是否为复合语句,它始终都会引入一个块作用域。换言之在其中声明的变量仅在循环体内可见。
while (--x >= 0) int i; // i 离开作用域
与下面的相同
while (--x >= 0) { int i; } // i 离开作用域
作为 C++ 向前进展保证的一部分,如果平凡的无限循环以外的 (C++26 起)没有可观察行为的循环不会终止,那么它的行为未定义。编译器可以移除这种循环。
关键词
示例
运行此代码
#include <iostream> int main() { // 带单语句的 while 循环 int i = 0; while (i < 10) i++; std::cout << i << '\n'; // 带复合语句的 while 循环 int j = 2; while (j < 9) { std::cout << j << ' '; j += 2; } std::cout << '\n'; // 带声明条件的 while 循环 char cstr[] = "Hello"; int k = 0; while (char c = cstr[k++]) std::cout << c; std::cout << '\n'; }
输出:
10 2 4 6 8 Hello