Namespaces
Variants

Statements

From cppreference.net

语句是C程序中按顺序执行的片段。任何函数的主体都是一个复合语句,而复合语句本身又是语句和声明的序列:

int main(void)
{ // 复合语句开始
    int n = 1; // 声明(非语句)
    n = n+1; // 表达式语句
    printf("n = %d\n", n); // 表达式语句
    return 0; // 返回语句
} // 复合语句结束,函数体结束


存在五种类型的语句:

可将 属性说明符序列 attr-spec-seq )应用于无标签语句,此时(除表达式语句外)属性将应用于相应的语句。

(since 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 标签。

任何语句(但非声明)都可以在前面带有任意数量的 标签 ,每个标签声明 identifier 为标签名称,该名称在所属函数内必须唯一(换言之,标签名称具有 函数作用域 )。

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

标签后必须跟随一条语句。

(C23前)

标签可以单独出现而不必跟随语句。若标签在代码块中独立存在,其行为等同于后接 空语句

可选的 attr-spec-seq 会应用于该标签。

(C23起)

复合语句

复合语句,或称 ,是由花括号括起的语句和声明序列。

{ 语句 | 声明 ... (可选) } (C23前)
属性说明序列 (可选) { 无标签语句 | 标签 | 声明 ... (可选) } (C23起)

复合语句允许将一组声明和语句组合成一个单元,该单元可在任何需要单个语句的地方使用(例如,在 if 语句或迭代语句中):

if (expr) // if语句开始
{ // 代码块开始
  int n = 1; // 声明
  printf("%d\n", n); // 表达式语句
} // 代码块结束,if语句结束

每个复合语句都会引入其自身的 块作用域

在块内声明的具有自动 存储期 的变量初始化器及VLA声明符,会在控制流按顺序经过这些声明时执行,其执行方式如同语句:

int main(void)
{ // 块开始
  { // 块开始
       puts("hello"); // 表达式语句
       int n = printf("abc\n"); // 声明语句,打印"abc",将4存入n
       int a[n*printf("1\n")]; // 声明语句,打印"1",分配8*sizeof(int)空间
       printf("%zu\n", sizeof(a)); // 表达式语句
  } // 块结束,n和a的作用域终止
  int n = 7; // n可被重复使用
}

表达式语句

一个表达式后跟分号即构成语句。

表达式 (可选) ; (1)
属性说明序列 表达式 ; (2) (自 C23 起)

典型C程序中的大多数语句都是表达式语句,例如赋值或函数调用。

没有表达式的表达式语句被称为 空语句 。它常用于为 for 循环或 while 循环提供空函数体。也可用于在复合语句末尾或声明之前承载标签:

puts("hello"); // 表达式语句
char *s;
while (*s++ != '\0')
    ; // 空语句

可选的 attr-spec-seq 可应用于该表达式。

后接 ; attr-spec-seq 不构成表达式语句,而是构成 属性声明

(since C23)

选择语句

选择语句根据表达式的值在多个语句中选择其一执行。

属性说明序列 (可选) (自 C23 起) if ( 表达式 ) 语句 (1)
属性说明序列 (可选) (自 C23 起) if ( 表达式 ) 语句 else 语句 (2)
属性说明序列 (可选) (自 C23 起) switch ( 表达式 ) 语句 (3)
1) if 语句
2) if 带 else 子句的语句
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: 待定)
  • 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++ 文档 关于 语句