Namespaces
Variants

Statements

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

语句 是 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 文档 关于 语句