跳到主要内容

C 语言 - 关键字

在 C 语言中,关键字是指那些对 C 编译器具有特殊含义的单词。最初由 ANSI C 标准定义的关键字一共 32 个,随着 C 语言的发展,C 语言支持的特性在增加,同时关键字也在增加。

标准关键字数量备注
C8932由 ANSI 标准定义
C9937新增5个
C1144新增7个

ANSI C 关键字

由 ANSI 标准定义的 C 语言关键字共32个:

auto     double   int       struct    break     else    long     switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static

根据关键字的作用,我们将其划分为五类:A - 基本数据类型,B - 类型修饰关键字,C - 复杂类型关键字,D - 存储级别关键字,E - 流程控制关键字。其中 ABCD 类都是用于修饰变量或函数,E 类用于控制程序的分支、循环、跳转结构。

ANSI C 32个关键字说明如下:

序号关键字说明类别
1void声明函数无返回值或无参数,声明无类型指针A
2char声明字符型变量或函数,属于整型数据的一种A
3int声明整型变量或函数A
3float声明浮点型变量或函数A
5double声明双精度变量或函数A
6short修饰 int,声明短整型变量或函数B
7long修饰 int,声明长整型变量或函数B
8signed修饰整型数据,声明有符号类型变量或函数B
9unsigned修饰整型数据,声明无符号类型变量或函数B
10struct声明结构体变量或函数C
11union声明共用数据类型C
12enum声明枚举类型C
13typedef用以给数据类型取别名C
14sizeof计算数据类型长度C
15auto声明自动变量,由编译器自动分配和释放(通常在栈上分配)D
16register声明寄存器变量,建议编译器将变量存储到寄存器中D
17static声明静态变量,分配在静态变量区,修饰函数时用于限定作用域D
18extern指定变量为外部变量,即在其他文件中声明D
19const声明只读变量D
20volatile说明变量在程序执行中可被隐含地改变D
21if条件语句E
22else条件语句否定分支(与 if 连用)E
23switch用于开关语句E
24case开关语句分支E
25default开关语句中的“其他”分支E
26for一种循环语句E
27do循环语句的循环体E
28while循环语句的循环条件E
29continue结束当前循环,开始下一轮循环E
30break跳出当前循环E
31goto无条件跳转语句E
32return子程序/函数体返回语句(可以带参数,也可不带参数)E

注意:C 语言中的 define 不是关键字,而是编译器的预编译指令,是由编译器实现的。实际上,C 语言的关键字是不能带 # 预处理命令的,所以 include、ifdef、ifndef、endif 这些都不是关键字,而是预编译指令。

C99 关键字

C99 在 C89(ANSI C)基础上增加了 5 个关键字:

  • inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代 C 中表达式形式的宏定义。

    引入原因:C 语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作。

  • restrict 关键字只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

  • _Bool 关键字是用于表示布尔值。包含标准头文件 stdbool.h 后,我们可以用 bool 代替 _Booltrue 代替 1 ,false 代替 0 。

  • _Complex_Imaginary 关键字,用于表示复数类型和虚数类型。复数类型包含一个实部和一个虚部,虚数类型只有虚部,没有实部。与 _Bool 类似,C99 也在头文件中定义了 compleximaginary 宏,并将它们扩展为 _Complex_Imaginary,因此在编写应用程序时应该使用头文件中的 compleximaginary 宏。

C11 关键字

C11 在 C99 基础上增加了 7 个关键字:

  • _Alignas 内存对齐指示符。
  • _Alignof 对齐处理操作符。函数 aligned_alloc(),以及头文件 <stdalign.h>
  • _Atomic 原子操作。头文件 <stdatomic.h>
  • _Generic 泛型。根据类型不同调用不同的函数,类似函数模板。
  • _Noreturn 指定该函数不返回到其调用点。
  • _Static_assert 静态断言。在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式。
  • _Thread_local 限定了变量不能在多线程之间共享。头文件 <threads.h>,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex(比如 mtx_lock(),mtx_unlock())等等。