語句
來自 cppreference.com
語句是 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
語句有五種型別:
1) 複合語句
2) 表示式語句
3) 選擇語句
4) 迭代語句
5) 跳轉語句
一個屬性說明符序列(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 程式中大多數語句都是表示式語句,例如賦值或函式呼叫。
沒有表示式的表示式語句稱為空語句。它通常用於為for或while迴圈提供空主體。它還可以用於在複合語句的末尾或宣告之前攜帶標籤。
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++ 文件 關於 語句
|