命名空間
變體
動作

語句

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

語句是 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)

目錄

[編輯] 標籤語句

標籤語句會為一個語句加上標籤,以用於控制流。

標籤 語句
標籤 - 應用於該語句的標籤(定義如下)
statement - 標籤所應用的語句,它本身也可以是標籤語句,從而允許使用多個標籤

[編輯] 標籤

標籤 定義如下

屬性 (可選) 識別碼 : (1)
屬性 (可選) case 常數表達式 : (2)
屬性 (可選) default: (3)
1) goto 的目標;
2) switch 語句中的 case 標籤;
3) switch 語句中的 default 標籤。

屬性序列 屬性 可以出現在標籤的開頭(這種情況下它應用於該標籤),或者出現在任何語句本身之前,這種情況下它應用於整個語句。

(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 內的每個 casedefault 標籤,只能與 S 內的 switch 語句相關聯。

[編輯] 表達式語句

表達式語句是一個後面跟著分號的表達式。

屬性 (可選) 表達式 (可選) ;
屬性 - (C++11 起) 可選的任意數量的屬性序列
expression - 一個表達式

典型 C++ 程式中的大多數語句都是表達式語句,例如賦值或函數呼叫。

沒有表達式的表達式語句稱為空語句 (null statement)。它通常用於為 forwhile 迴圈提供空主體。它也可用於在複合語句的末尾放置一個標籤。(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 起)
1) if 語句;
2) 帶有 else 子句的 if 語句;
3) switch 語句;
4) consteval if 語句;
5) 帶有 else 子句的 consteval if 語句。

[編輯] 迭代語句

迭代語句會重複執行某些程式碼。

屬性 (可選) while ( 條件 ) 語句 (1)
屬性 (可選) do 語句 while ( 表達式 ) ; (2)
屬性 (可選) for ( 初始化語句 條件 (可選) ; 表達式 (可選) ) 語句 (3)
屬性 (可選) for
    ( 初始化語句 (可選)(C++20 起) for 範圍宣告 : for 範圍初始化 ) 語句
(4) (C++11 起)
1) while 迴圈;
2) do-while 迴圈;
3) for 迴圈;
4) range for 迴圈。

[編輯] 跳轉語句

跳轉語句無條件地轉移控制流。

屬性 (可選) break; (1)
屬性 (可選) continue; (2)
屬性 (可選) return 表達式 (可選) ; (3)
屬性 (可選) return 大括號初始化列表 ; (4) (C++11 起)
屬性 (可選) goto 識別碼 ; (5)
1) break 語句;
2) continue 語句;
3) 帶有可選表達式的 return 語句;
4) 使用列表初始化return 語句;
5) goto 語句。

注意:對於所有跳轉語句,移出迴圈、移出區塊或往回跳過具有自動儲存期的已初始化變數,都涉及銷毀在移出點處於作用域內,但在移入點處不在作用域內的自動儲存期物件。如果初始化了多個物件,銷毀順序為初始化順序的相反順序。

斷言語句 (Assertion statements)

一個合約斷言 (contract assertion)。

contract_assert 屬性 (可選) ( 謂詞 ) ;
1) contract_assert 語句。
(C++26 起)

[編輯] 宣告語句

宣告語句將一個或多個識別碼引入區塊中。

區塊宣告 (1)
1) 詳細資訊請參閱宣告初始化

[編輯] try 區塊

try 區塊會捕捉執行其他語句時拋出的異常。

屬性 (可選) try 複合語句 處理常式序列 (1)
1) 詳細資訊請參閱 try 區塊


原子與同步區塊 (Atomic and synchronized blocks)

原子與同步區塊提供事務記憶體 (transactional memory)

synchronized 複合語句 (1) (TM TS)
atomic_noexcept 複合語句 (2) (TM TS)
atomic_cancel 複合語句 (3) (TM TS)
atomic_commit 複合語句 (4) (TM TS)
1) synchronized 區塊,與所有同步區塊以單一全序執行;
2) 遇到異常時會中止的 atomic 區塊
3) 遇到異常時會回滾的 atomic 區塊
4) 遇到異常時會提交的 atomic 區塊
(TM TS)

[編輯] 子語句

語句的子語句為下列之一

  • 對於標籤語句,為其 語句 。
  • 對於複合語句,為其 語句...  中的任何語句。
  • 對於選擇語句,為其 語句 複合語句 (C++23 起) 中的任何一個。
  • 對於迭代語句,為其 語句 。

如果滿足以下任一條件,語句 S1 包含 (encloses) 語句 S2

  • S2S1 的子語句
  • S1 是選擇語句或迭代語句,且 S2S1初始化語句
  • S1try 區塊,且 S2 是其 複合語句,或者是其 處理常式序列 中任何 處理常式複合語句
  • S1 包含語句 S3,且 S3 包含 S2

如果 S2 包含 S1,則語句 S1 S2 包含

[編輯] 參見

C 文件 中的 語句 (Statements)