語句
語句 是 C++ 程式中按順序執行的程式碼片段。任何函式的主體都是一系列語句。例如
int main() { int n = 1; // declaration statement n = n + 1; // expression statement std::cout << "n = " << n << '\n'; // expression statement return 0; // return statement }
C++ 包括以下型別的語句
| (C++26 起) |
| (TM TS) |
目錄 |
[編輯] 帶標籤語句
帶標籤語句為語句貼上標籤,用於控制流目的。
| label statement | |||||||||
| 標籤 | - | 應用於語句的標籤(定義如下) |
| 語句 | - | 標籤所應用的語句,它可以是帶標籤語句本身,允許多個標籤 |
[編輯] 標籤
label 定義為
attr (可選) identifier : |
(1) | ||||||||
attr (可選) case constexpr : |
(2) | ||||||||
attr (可選) default: |
(3) | ||||||||
|
屬性序列 attr 可以出現在標籤的開頭(在這種情況下,它應用於標籤),或者緊鄰任何語句本身之前,在這種情況下,它應用於整個語句。 |
(C++11 起) |
在函式內部宣告的帶有識別符號的標籤與該函式中所有巢狀塊中,在其宣告之前和之後,具有相同識別符號的所有 goto 語句匹配。
一個函式中的兩個標籤不能具有相同的識別符號。
|
除了新增到語句之外,標籤還可以用於複合語句中的任何位置。 |
(C++23 起) |
標籤不會透過非限定查詢找到:標籤可以與程式中的任何其他實體同名。
void f() { { goto label; // label in scope even though declared later label: // label can appear at the end of a block standalone since C++23 } goto label; // label ignores block scope } void g() { goto label; // error: label not in scope in g() }
[編輯] 受控制流限制的語句
以下語句是 受控制流限制的語句
| (C++17 起) | |
|
(C++23 起) |
對於每個受控制流限制的語句 S
- 在
S中宣告的所有 goto 目標標籤只能由S中的語句引用。 - 在
S中出現的每個 case 或 default 標籤只能與S中的 switch 語句關聯。
[編輯] 表示式語句
表示式語句是後跟分號的表示式。
attr (可選) expression (可選) ; |
|||||||||
| 屬性 | - | (C++11 起) 可選的任意數量屬性序列 |
| 表示式 | - | 一個表示式 |
典型 C++ 程式中的大多數語句都是表示式語句,例如賦值或函式呼叫。
沒有表示式的表示式語句稱為 空語句。它通常用於為 for 或 while 迴圈提供空主體。它也可以用於在複合語句的末尾攜帶一個標籤。(C++23 前)
[編輯] 複合語句
複合語句或 塊 將一系列語句組合成單個語句。
attr (可選) { statement... (可選) label... (可選)(C++23 起) } |
|||||||||
當期望一個語句,但需要按順序執行多個語句時(例如,在 if 語句或迴圈中),可以使用複合語句
if (x > 5) // start of if statement { // start of block int n = 1; // declaration statement std::cout << n; // expression statement } // end of block, end of if statement
每個複合語句都引入自己的塊作用域;塊內宣告的變數在結束大括號處按相反順序銷燬
int main() { // start of outer block { // start of inner block std::ofstream f("test.txt"); // declaration statement f << "abc\n"; // expression statement } // end of inner block, f is flushed and closed std::ifstream f("test.txt"); // declaration statement std::string str; // declaration statement f >> str; // expression statement } // end of outer block, str is destroyed, f is closed
|
複合語句末尾的標籤被視為後面跟著一個空語句。 |
(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 compound-statement handler-sequence |
(1) | ||||||||
原子和同步塊原子和同步塊提供事務性記憶體。
1) 同步塊,與所有同步塊以單一總順序執行;
2) 遇到異常時中止的原子塊;
3) 遇到異常時回滾的原子塊;
4) 遇到異常時提交的原子塊。
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[編輯] 子語句
語句的 子語句 是以下之一
如果滿足以下任何條件,語句 S1 包含 語句 S2
- S2 是 S1 的子語句
- S1 是選擇語句或迭代語句,且 S2 是 S1 的 init-statement。
- S1 是 try 塊,且 S2 是其 複合語句 或其 handler-seq 中任何 處理程式 的 複合語句。
- S1 包含語句 S3 且 S3 包含 S2。
如果語句 S2 包含 S1,則語句 S1 被 語句 S2 包含。
[編輯] 另見
| C 文件 關於 語句
|