语句
来自 cppreference.cn
语句是 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 起) |
[编辑] 复合语句
复合语句,或块,是用花括号括起来的语句和声明序列。
{ statement | declaration...(可选) } |
(直到 C23) | ||||||||
attr-spec-seq(可选) { unlabeled-statement | label | declaration...(可选) } |
(自 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 应用于表达式。 后跟 |
(自 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 语句和块 (页码: 待定)
- C17 标准 (ISO/IEC 9899:2018)
- 6.8 语句和块 (页码: 106-112)
- C11 标准 (ISO/IEC 9899:2011)
- 6.8 语句和块 (页码: 146-154)
- C99 标准 (ISO/IEC 9899:1999)
- 6.8 语句和块 (页码: 131-139)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.6 语句
[编辑] 参见
C++ 文档 关于 语句
|