Namespaces
Variants

while loop

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

有条件地重复执行一条语句。

目录

语法

attr  (可选) while ( condition ) statement
attr - (since C++11) 任意数量的 属性
condition - 一个 条件表达式
statement - 一条 语句 (通常是复合语句)

条件表达式

一个 条件 可以是 表达式 ,也可以是 简单声明

  • 如果语法上可以解析为 结构化绑定 声明,则将其解释为结构化绑定声明。
(since C++26)
  • 如果它能被语法解析为表达式,则被视为表达式。否则,它被视为声明 (非结构化绑定声明 (自 C++26 起)

当控制流到达条件语句时,该条件将产生一个值,该值用于判断是否执行 statement

表达式

如果 condition 是一个表达式,其产生的值是该表达式在上下文中转换为 bool 类型后的值。如果该转换不合法,则程序不合法。

声明

如果 condition 是一个简单声明,其产生的值是由决策变量(见下文)经上下文转换到 bool 类型的值。若该转换格式错误,则程序格式错误。

非结构化绑定声明

该声明具有以下限制:

  • 语法上符合以下形式:
  • 类型说明符序列 声明符 = 赋值表达式
(C++11 前)
  • 属性说明符序列 (可选) 声明说明符序列 声明符 花括号或等号初始化器
(C++11 起)

声明的决策变量即为所声明的变量。

结构化绑定声明

该声明具有以下限制:

该声明的决策变量是由 声明引入的 虚构变量 e

(since C++26)

说明

一个 while 语句等价于

/* 标签 */ :

{

if ( 条件 )
{
语句
goto /* 标签 */ ;
}

}

如果 condition 是一个声明,那么它所声明的变量会在每次循环迭代时被销毁并重新创建。

如果循环需要在 statement 内部终止,可以使用 break statement 作为终止语句。

若需要在 statement 中终止当前迭代,可使用 continue 语句 作为快捷方式。

注释

无论 statement 是否为复合语句,它始终会引入一个 块作用域 。在其中声明的变量仅在循环体内可见,换言之,

while (--x >= 0)
    int i;
// i 超出作用域

等同于

while (--x >= 0)
{
    int i;
} // i 超出作用域

作为 C++ 向前进展保证 的一部分,如果循环 (非 平凡无限循环 (C++26 起) 在没有 可观察行为 的情况下未能终止,则其行为是 未定义 的。编译器被允许移除此类循环。

关键词

while

示例

#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

参见

C 文档 关于 while