C 关键字

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

标准 关键字数量 备注
C89 32 由 ANSI 标准定义
C99 37 新增5个
C11 44 新增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个关键字说明如下:

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

Leave a Reply