語句
語句是 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++ 包含以下類型的語句
- 標籤語句 (Labeled statements)
- 運算式陳述式 (Expression statements)
- 複合陳述式 (Compound statements)
- 選擇陳述式 (Selection statements)
- 迭代陳述式 (Iteration statements)
- 跳躍陳述式
| (C++26 起) |
| (TM TS) |
目錄 |
[編輯] 標籤語句
標籤語句會為一個語句加上標籤,以用於控制流。
| 標籤 語句 | |||||||||
| 標籤 | - | 應用於該語句的標籤(定義如下) |
| statement | - | 標籤所應用的語句,它本身也可以是標籤語句,從而允許使用多個標籤 |
[編輯] 標籤
標籤 定義如下
屬性 (可選) 識別碼 : |
(1) | ||||||||
屬性 (可選) case 常數表達式 : |
(2) | ||||||||
屬性 (可選) default: |
(3) | ||||||||
|
屬性序列 屬性 可以出現在標籤的開頭(這種情況下它應用於該標籤),或者出現在任何語句本身之前,這種情況下它應用於整個語句。 |
(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() }
[編輯] 控制流受限語句
以下語句為控制流受限語句
- try 區塊的 複合語句。
- 處理常式 (handler) 的 複合語句。
| (自 C++17 起) | |
|
(自 C++23 起) |
對於每個控制流受限語句 S
- 所有在
S中宣告的 goto 目標標籤,只能被S內的語句所參照。 - 出現在
S內的每個 case 或 default 標籤,只能與S內的 switch 語句相關聯。
[編輯] 表達式語句
表達式語句是一個後面跟著分號的表達式。
屬性 (可選) 表達式 (可選) ; |
|||||||||
| 屬性 | - | (C++11 起) 可選的任意數量的屬性序列 |
| expression | - | 一個表達式 |
典型 C++ 程式中的大多數語句都是表達式語句,例如賦值或函數呼叫。
沒有表達式的表達式語句稱為空語句 (null statement)。它通常用於為 for 或 while 迴圈提供空主體。它也可用於在複合語句的末尾放置一個標籤。(C++23 前)
[編輯] 複合語句
複合語句或區塊 (block) 將一系列語句分組為單個語句。
屬性 (可選) { 語句... (可選) 標籤... (可選)(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 起) |
[編輯] 選擇語句
選擇語句在多個控制流之間進行選擇。
屬性 (可選) if constexpr(可選) ( 初始化語句 (可選) 條件 ) 語句 |
(1) | ||||||||
屬性 (可選) if constexpr(可選) ( 初始化語句 (可選) 條件 ) 語句 else 語句 |
(2) | ||||||||
屬性 (可選) switch ( 初始化語句 (可選) 條件 ) 語句 |
(3) | ||||||||
屬性 (可選) if !(可選) consteval 複合語句 |
(4) | (自 C++23 起) | |||||||
屬性 (可選) if !(可選) consteval 複合語句 else 語句 |
(5) | (自 C++23 起) | |||||||
[編輯] 迭代語句
迭代語句會重複執行某些程式碼。
屬性 (可選) while ( 條件 ) 語句 |
(1) | ||||||||
屬性 (可選) do 語句 while ( 表達式 ) ; |
(2) | ||||||||
屬性 (可選) for ( 初始化語句 條件 (可選) ; 表達式 (可選) ) 語句 |
(3) | ||||||||
屬性 (可選) for ( 初始化語句 (可選)(C++20 起) for 範圍宣告 : for 範圍初始化 ) 語句 |
(4) | (C++11 起) | |||||||
[編輯] 跳轉語句
跳轉語句無條件地轉移控制流。
屬性 (可選) break; |
(1) | ||||||||
屬性 (可選) continue; |
(2) | ||||||||
屬性 (可選) return 表達式 (可選) ; |
(3) | ||||||||
屬性 (可選) return 大括號初始化列表 ; |
(4) | (C++11 起) | |||||||
屬性 (可選) goto 識別碼 ; |
(5) | ||||||||
注意:對於所有跳轉語句,移出迴圈、移出區塊或往回跳過具有自動儲存期的已初始化變數,都涉及銷毀在移出點處於作用域內,但在移入點處不在作用域內的自動儲存期物件。如果初始化了多個物件,銷毀順序為初始化順序的相反順序。
斷言語句 (Assertion statements)一個合約斷言 (contract assertion)。
1)
contract_assert 語句。 |
(C++26 起) | |||||||||||||||||||||||
[編輯] 宣告語句
宣告語句將一個或多個識別碼引入區塊中。
| 區塊宣告 | (1) | ||||||||
[編輯] try 區塊
try 區塊會捕捉執行其他語句時拋出的異常。
屬性 (可選) try 複合語句 處理常式序列 |
(1) | ||||||||
原子與同步區塊 (Atomic and synchronized blocks)原子與同步區塊提供事務記憶體 (transactional memory)。
1) synchronized 區塊,與所有同步區塊以單一全序執行;
2) 遇到異常時會中止的 atomic 區塊;
3) 遇到異常時會回滾的 atomic 區塊;
4) 遇到異常時會提交的 atomic 區塊。
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[編輯] 子語句
語句的子語句為下列之一
如果滿足以下任一條件,語句 S1 包含 (encloses) 語句 S2
- S2 是 S1 的子語句
- S1 是選擇語句或迭代語句,且 S2 是 S1 的 初始化語句。
- S1 是 try 區塊,且 S2 是其 複合語句,或者是其 處理常式序列 中任何 處理常式 的 複合語句。
- S1 包含語句 S3,且 S3 包含 S2。
如果 S2 包含 S1,則語句 S1 被 S2 包含。
[編輯] 參見
| C 文件 中的 語句 (Statements)
|