Statements
语句 是 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) | ||||||||
|
一个 属性 序列 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 起) | |||||||
迭代语句
迭代语句会重复执行某些代码。
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 起) | |||||||
跳转语句
跳转语句无条件地转移控制流。
attr
(可选)
break;
|
(1) | ||||||||
attr
(可选)
continue;
|
(2) | ||||||||
attr
(可选)
return
expression
(可选)
;
|
(3) | ||||||||
attr
(可选)
return
braced-init-list
;
|
(4) | (自 C++11 起) | |||||||
attr
(可选)
goto
identifier
;
|
(5) | ||||||||
注意:对于所有跳转语句,从循环中跳出、从代码块中跳出,或跳回经过具有自动存储期的已初始化变量时,都会涉及销毁具有自动存储期的对象,这些对象在跳出点处于作用域内,但在跳入点不处于作用域内。如果多个对象已被初始化,则销毁顺序与初始化顺序相反。
断言语句合约断言。
1)
contract_assert
语句。
|
(自 C++26 起) | |||||||||||||||||||||||
声明语句
声明语句将一个或多个标识符引入到块中。
| 块声明 | (1) | ||||||||
try 块
一个 try 块用于捕获执行其他语句时抛出的异常。
attr
(可选)
try
复合语句 异常处理序列
|
(1) | ||||||||
原子与同步块原子与同步块提供 事务性内存 功能。
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 文档
关于
语句
|