命名空间
变体
操作

语句

来自 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 起) 标识符 : (1)
attr-spec-seq(可选)(自 C23 起) case 常量表达式 : (2)
attr-spec-seq(可选)(自 C23 起) default : (3)
1) goto 的目标。
2) switch 语句中的 case 标签。
3) switch 语句中的 default 标签。

任何语句(但不是声明)都可以用任意数量的标签作为前缀,每个标签都声明标识符为一个标签名称,该名称在封闭函数中必须是唯一的(换句话说,标签名称具有函数作用域)。

标签声明本身没有效果,不会改变控制流,也不会以任何方式修改其后语句的行为。

标签后应紧跟一个语句。

(直到 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
}

[编辑] 表达式语句

表达式后跟一个分号是一个语句。

表达式(可选) ; (1)
attr-spec-seq 表达式 ; (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 ( 表达式 ) 语句 (1)
attr-spec-seq(可选)(自 C23 起) if ( 表达式 ) 语句 else 语句 (2)
attr-spec-seq(可选)(自 C23 起) switch ( 表达式 ) 语句 (3)
1) if 语句
2) 带有 else 子句的if 语句
3) switch 语句

[编辑] 迭代语句

迭代语句重复执行一个语句。

attr-spec-seq(可选)(自 C23 起) while ( 表达式 ) 语句 (1)
attr-spec-seq(可选)(自 C23 起) do 语句 while ( 表达式 ) ; (2)
attr-spec-seq(可选)(自 C23 起) for ( 初始化子句 ; 表达式(可选) ; 表达式(可选) ) 语句 (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 表达式(可选) ; (3)
attr-spec-seq(可选)(自 C23 起) goto 标识符 ; (4)
1) break 语句
2) continue 语句
3) 带有可选表达式的return 语句
4) goto 语句

[编辑] 参考

  • 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++ 文档 for 语句