Namespaces
Variants

Statements

From zh.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

语句 是 C++ 程序按顺序执行的片段。任何函数的主体都是一个语句序列。例如:

int main()
{
    int n = 1;                        // 声明语句
    n = n + 1;                        // 表达式语句
    std::cout << "n = " << n << '\n'; // 表达式语句
    return 0;                         // 返回语句
}

C++包含以下类型的语句:

(since C++26)
(TM TS)

目录

标签语句

带标签语句为控制流目的对语句进行标记。

标签语句
label - 应用于语句的标签(定义见下文)
statement - 标签所应用的语句,该语句本身可以是带标签的语句,从而允许多重标签

标签

label 被定义为

attr  (可选) identifier : (1)
attr  (可选) case constexpr : (2)
attr  (可选) default: (3)
1) goto 语句的目标;
2) case 标签在 switch 语句中;
3) default 标签在 switch 语句中。

一个 属性 序列 attr 可以出现在标签的开头(此时它应用于标签),或者紧接在任何语句本身之前,此时它应用于整个语句。

(since C++11)

函数内部声明的带标识符标签,会匹配该函数中所有嵌套块内(无论在其声明之前还是之后)具有相同标识符的goto语句。

函数中的两个标签不得具有相同的标识符。

除了可以添加到语句中,标签也可用于 复合语句 中的任意位置。

(since C++23)

标签不会被 非限定查找 所发现:标签可以与程序中的任何其他实体同名。

void f()
{
    {
        goto label; // 即使标签在后方声明也处于作用域内
        label:      // 自 C++23 起标签可独立出现在代码块末尾
    }
    goto label; // 标签不受块作用域限制
}
void g()
{
    goto label; // 错误:g() 函数中标签不在作用域内
}

控制流受限语句

以下语句属于 控制流受限语句 :

(C++17 起)
(C++23 起)

对于每个受控制流限制的语句 S :

  • 所有在 S 中声明的 goto 目标标签只能被 S 中的语句引用。
  • 每个出现在 S 中的 case 或 default 标签只能与 S 内的 switch 语句 相关联。

表达式语句

表达式语句是由分号跟随的表达式。

attr  (可选) expression  (可选) ;
attr - (since C++11) 任意数量的 属性 的可选序列
expression - 一个 表达式

典型的 C++ 程序中的大多数语句都是表达式语句,例如赋值或函数调用。

没有表达式的表达式语句被称为 空语句 。它常用于为 for 循环或 while 循环提供空函数体。 也可用于在复合语句末尾承载标签。 (直至 C++23)

复合语句

复合语句或 块 将一系列语句组合成单个语句。

attr  (可选) { statement...  (可选) label...  (可选) (自 C++23 起) }

当预期为单条语句,但需要按顺序执行多条语句时(例如在 if 语句或循环中),可以使用复合语句:

if (x > 5)          // if语句开始
{                   // 代码块开始
    int n = 1;      // 声明语句
    std::cout << n; // 表达式语句
}                   // 代码块结束,if语句结束

每个复合语句都会引入其自身的块 作用域 ;在块内部声明的变量会以逆序方式在右花括号处被销毁:

int main()
{ // 外部代码块起始
    {                                // 内部代码块起始
        std::ofstream f("test.txt"); // 声明语句
        f << "abc\n";                // 表达式语句
    }                                // 内部代码块结束,f被刷新并关闭
    std::ifstream f("test.txt"); // 声明语句
    std::string str;             // 声明语句
    f >> str;                    // 表达式语句
} // 外部代码块结束,str被销毁,f被关闭

位于复合语句末尾的 标签 会被视为其后跟随了一个空语句。

(since C++23)

选择语句

选择语句在多个控制流中选取其一。

attr  (可选) if constexpr (可选) ( init-statement  (可选) condition ) statement (1)
attr  (可选) if constexpr (可选) ( init-statement  (可选) condition ) statement
else statement
(2)
attr  (可选) switch ( init-statement  (可选) condition ) statement (3)
attr  (可选) if ! (可选) consteval compound-statement (4) (自 C++23 起)
attr  (可选) if ! (可选) consteval compound-statement else statement (5) (自 C++23 起)
1) if 语句;
2) if 语句带 else 子句;
3) switch 语句;
4) consteval if 语句;
5) consteval if 语句带 else 子句。

迭代语句

迭代语句会重复执行某些代码。

attr  (可选) while ( condition ) statement (1)
attr  (可选) do statement while ( expression ) ; (2)
attr  (可选) for ( init-statement condition  (可选) ; expression  (可选) ) statement (3)
attr  (可选) for
( init-statement  (可选) (自 C++20 起) for-range-decl : for-range-init ) statement
(4) (自 C++11 起)
1) while 循环;
2) do-while 循环;
3) for 循环;
4) 范围 for 循环。

跳转语句

跳转语句无条件地转移控制流。

attr  (可选) break; (1)
attr  (可选) continue; (2)
attr  (可选) return expression  (可选) ; (3)
attr  (可选) return braced-init-list ; (4) (自 C++11 起)
attr  (可选) goto identifier ; (5)
1) break 语句;
2) continue 语句;
3) return 带可选表达式的语句;
5) goto 语句。

注意:对于所有跳转语句,从循环中跳出、从代码块中跳出,或跳回经过具有自动存储期的已初始化变量时,都会涉及销毁具有自动存储期的对象,这些对象在跳出点处于作用域内,但在跳入点不处于作用域内。如果多个对象已被初始化,则销毁顺序与初始化顺序相反。

断言语句

合约断言。

contract_assert attr  (可选) ( predicate ) ;
1) contract_assert 语句。
(自 C++26 起)

声明语句

声明语句将一个或多个标识符引入到块中。

块声明 (1)
1) 有关详细信息,请参阅 声明 和 初始化 。

try 块

一个 try 块用于捕获执行其他语句时抛出的异常。

attr  (可选) try 复合语句 异常处理序列 (1)
1) 有关详细信息,请参阅 try 块 。


原子与同步块

原子与同步块提供 事务性内存 功能。

synchronized 复合语句 (1) (TM TS)
atomic_noexcept 复合语句 (2) (TM TS)
atomic_cancel 复合语句 (3) (TM TS)
atomic_commit 复合语句 (4) (TM TS)
1) 同步块 ,与所有同步块按单一全局顺序执行;
2) 原子块 ,在异常发生时中止执行;
3) 原子块 ,在异常发生时回滚操作;
4) 原子块 ,在异常发生时提交操作。
(TM TS)

子语句

语句的 子语句 指以下情况之一:

语句 S1 包含 语句 S2 当满足以下任一条件时:

  • S2 是 S1 的子语句
  • S1 是选择语句或迭代语句,且 S2 是 S1 的 init-statement
  • S1 是 try 块 ,且 S2 是其 compound-statement 或其 handler-seq 中任意 handler 的 compound-statement 
  • S1 包含语句 S3 ,且 S3 包含 S2

当语句 S2 包含语句 S1 时,我们称 S1 被 S2 所包围 。

参见

C 文档 关于 语句