名稱空間
變體
操作

語句

來自 cppreference.com
< c‎ | 語言

語句是 C 程式的片段,按順序執行。任何函式的主體都是一個複合語句,而複合語句又是一系列語句和宣告。

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body


語句有五種型別:

一個屬性說明符序列attr-spec-seq)可以應用於無標籤語句,在這種情況下(表示式語句除外),屬性應用於相應的語句。

(自 C23 起)

目錄

[編輯] 標籤

任何語句都可以被標記,方法是在語句本身之前提供一個名稱,後跟一個冒號。

attr-spec-seq(可選)(C23 起) identifier : (1)
attr-spec-seq(可選)(C23 起) case constant-expression : (2)
attr-spec-seq(可選)(C23 起) default : (3)
1) goto 的目標。
2) switch 語句中的 case 標籤。
3) switch 語句中的 default 標籤。

任何語句(但不是宣告)都可以前面有任意數量的標籤,每個標籤都將identifier宣告為標籤名,該標籤名在包含函式內必須是唯一的(換句話說,標籤名具有函式作用域)。

標籤宣告本身沒有效果,不改變控制流,也不以任何方式修改其後語句的行為。

標籤後必須跟一個語句。

(直至 C23)

標籤可以沒有其後的語句。如果一個標籤單獨出現在一個塊中,它的行為就像後面跟著一個空語句一樣。

可選的attr-spec-seq應用於標籤。

(自 C23 起)

[編輯] 複合語句

複合語句,或,是一個由花括號括起來的語句和宣告序列。

{ 語句 | 宣告...(可選) } (直至 C23)
attr-spec-seq(可選) { 無標籤語句 | 標籤 | 宣告...(可選) } (自 C23 起)

複合語句允許將一組宣告和語句組合成一個單元,該單元可以用於任何需要單個語句的地方(例如,在if 語句或迭代語句中)。

if (expr) // start of if-statement
{ // start of block
  int n = 1; // declaration
  printf("%d\n", n); // expression statement
} // end of block, end of if-statement

每個複合語句都引入自己的塊作用域

塊內宣告的具有自動儲存期變數的初始化器和 VLA 宣告符在控制流按順序經過這些宣告時執行,就像它們是語句一樣。

int main(void)
{ // start of block
  { // start of block
       puts("hello"); // expression statement
       int n = printf("abc\n"); // declaration, prints "abc", stores 4 in n
       int a[n*printf("1\n")]; // declaration, prints "1", allocates 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // expression statement
  } // end of block, scope of n and a ends
  int n = 7; // n can be reused
}

[編輯] 表示式語句

一個表示式後跟一個分號是一個語句。

expression(可選) ; (1)
attr-spec-seq expression ; (2) (自 C23 起)

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

沒有表示式的表示式語句稱為空語句。它通常用於為forwhile迴圈提供空主體。它還可以用於在複合語句的末尾或宣告之前攜帶標籤。

puts("hello"); // expression statement
char *s;
while (*s++ != '\0')
    ; // null statement

可選的attr-spec-seq應用於表示式。

attr-spec-seq 後跟 ; 不構成表示式語句。它構成屬性宣告

(自 C23 起)

[編輯] 選擇語句

選擇語句根據表示式的值選擇幾個語句中的一個。

attr-spec-seq(可選)(C23 起) if ( expression ) statement (1)
attr-spec-seq(可選)(C23 起) if ( expression ) statement else statement (2)
attr-spec-seq(可選)(C23 起) switch ( expression ) statement (3)
1) if 語句
2) 帶 else 子句的 if 語句
3) switch 語句

[編輯] 迭代語句

迭代語句重複執行一個語句。

attr-spec-seq(可選)(C23 起) while ( expression ) statement (1)
attr-spec-seq(可選)(C23 起) do statement while ( expression ) ; (2)
attr-spec-seq(可選)(C23 起) for ( init-clause ; expression(可選) ; expression(可選) ) statement (3)
1) while 迴圈
2) do-while 迴圈
3) for 迴圈

[編輯] 跳轉語句

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

attr-spec-seq(可選)(C23 起) break ; (1)
attr-spec-seq(可選)(C23 起) continue ; (2)
attr-spec-seq(可選)(C23 起) return expression(可選) ; (3)
attr-spec-seq(可選)(C23 起) goto identifier ; (4)
1) break 語句
2) continue 語句
3) 帶可選表示式的 return 語句
4) goto 語句

[編輯] 參考文獻

  • C23 標準 (ISO/IEC 9899:2024)
  • 6.8 語句和塊 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 6.8 語句和塊 (p: 106-112)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.8 語句和塊 (p: 146-154)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.8 語句和塊 (p: 131-139)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.6 語句

[編輯] 參見

C++ 文件 關於 語句