首页 > 编程笔记 > C语言笔记(精华版)

C语言关键字大全(44个,附带详细解释)

C语言经过了半个多世纪的发展,有多个标准或版本,具体来说包括 C89(ANSI C)、C99、C11 和 C11,笔者将根据不同标准列出C语言的所有关键字,并附带简答的说明。

C89(ANSI C)标准

这是C语言的第一个标准,1989 年由美国国家标准委员会(American National Standards Institute,简称 ANSI)制定,所以被称为 ANSI C。又由于这个版本是 89 年完成制定的,因此也被称为 C89。


后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990 年被 ISO 采纳为国际标准,称为 ISO C。又因为这个版本是1990年发布的,因此也被称为 C90。

ANSI C(C89)与 ISO C(C90)内容基本相同,主要是格式组织不一样,所以它们实际上是同一套标准。

C89 标准关键字(32个)
类别 关键字 说明
数据类型 int 用于声明整型变量,通常占用 4 字节内存
float 用于声明单精度浮点数,通常占用 4 字节内存
double 用于声明双精度浮点数,通常占用 8 字节内存
char 用于声明字符类型,占用 1 字节内存
类型修饰符 short 用于修饰整型,缩小其范围和内存占用
long 用于修饰整型或双精度浮点型,扩大其范围
signed 表示数据类型可以存储正负值(默认情况)
unsigned 表示数据类型只能存储非负值
void 表示无类型或空类型,常用于函数返回值
存储类型 auto 默认的存储类型,变量在块内自动分配和释放
register 建议编译器将变量存储在寄存器中以提高访问速度
static 使局部变量在函数调用之间保持其值,或限制全局变量的作用域
外部链接 extern 声明一个在其他文件中定义的全局变量或函数
typedef 用于创建自定义类型名,简化复杂的类型声明
控制流 if 条件语句,根据条件执行不同的代码块
else 与 if 配合使用,指定条件不满足时执行的代码块
switch 多路分支语句,根据表达式的值选择执行不同的代码块
case 在 switch 语句中指定一个待匹配的值
default 在 switch 语句中指定当没有 case 匹配时执行的代码块
循环结构 for 用于创建一个具有初始化、条件和更新表达式的循环
while 当条件为真时重复执行代码块的循环
do 与 while 配合使用,创建一个至少执行一次的循环
break 用于提前退出循环或 switch 语句
continue 跳过循环的当前迭代,直接进入下一次迭代
跳转语句 goto 无条件跳转到程序中的标记位置
return 从函数中返回值并结束函数的执行
常量定义 const 声明一个不可修改的变量(常量)
联合体 union 定义一个共享内存空间的数据结构
结构体 struct 定义一个包含多个不同数据类型成员的复合数据类型
enum 定义一组命名的整型常量
位操作 volatile 告诉编译器变量可能会被意外改变,防止过度优化
大小计算 sizeof 返回数据类型或表达式的字节大小

C99 标准

1995 年,C程序设计语言工作组对C语言进行了一些修改,增加了新的关键字和数据类型,编写了新的库,取消了原有的限制,并于 1999 年形成新的标准——ISO/IEC 9899:1999 标准,通常被称为 C99。


C99 标准是C语言的一个重要里程碑,为这门经典的编程语言带来了许多新特性和改进。C99 标准新增了以下 5 个关键字。
 

C99 标准新增关键字(5个)
关键字 说明
inline 用于函数定义,建议编译器将函数代码直接插入到调用处,以提高程序执行效率。这个关键字主要用于优化小型、频繁调用的函数。
restrict 用于指针声明,告诉编译器该指针是访问某一内存区域的唯一途径。这使得编译器可以进行更激进的优化,因为它可以确信不会通过其他途径修改该内存区域。
_Bool 引入了布尔类型,可以存储 0(假)或 1(真)。这使得逻辑运算和条件判断更加清晰和直观。在使用时,通常会包含 头文件,这样就可以直接使用 bool 而不是 _Bool。
_Complex 用于声明复数类型。C99 标准引入了对复数的原生支持,使得科学计算和信号处理等领域的编程变得更加方便。
_Imaginary 用于声明纯虚数类型。与 _Complex 配合使用,可以完整地表示复数系统中的所有数。

C11 标准

C11 标准由国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会于 2011 年底正式发布,主要增加了安全函数,以及对多线程的支持。


C11 新增关键字(7个)
关键字 说明
_Alignas 用于指定变量的对齐方式,可以提高内存访问效率。
_Alignof 用于获取类型的对齐要求,并并返回一个 size_t 类型的值,表示指定类型的对齐字节数。
_Atomic 用于声明原子类型,确保在多线程环境中对该类型的操作是原子的,避免数据竞争。
_Generic 用于实现类型泛型编程,根据表达式的类型选择不同的代码路径,它允许我们根据参数类型编写更灵活的函数。
_Noreturn 用于指示函数不会返回到调用者。这通常用于终止程序的函数,如 exit()。
_Static_assert 用于在编译时进行断言检查,如果断言失败,编译器会报错。这有助于捕获一些潜在的编程错误。
_Thread_local 用于声明线程局部存储的变量。每个线程都会有该变量的独立副本,这在多线程编程中非常有用。


值得注意的是,这些关键字都以下划线开头,这是为了避免与现有的用户定义标识符发生冲突。

C17 标准

2018 年,ISO/IEC 又发布了 C11 标准的修正版,称为 C17 或者 C18 标准。和 C11 标准相比,C17 并没有添加新的功能和语法特性,仅仅修正了 C11 标准中已知的一些缺陷,所以 C17 标准并没有新增任何关键字。

汇总(44个关键字)

截止到 2024 年末,C17 是最新的C语言标准,至此,C语言的关键字总数已经达到了 44 个。32 个传统C语言关键字 + 5个C99新增关键字 + 7个C11新增关键字 = 44 个关键字。

关于下划线

稍加留意就可以发现,C99、C11、C17 中的很多关键字都以下划线_开头,这种命名约定并非偶然,而是经过深思熟虑的设计决策。


C语言的设计者们面临着一个棘手的问题:如何在保持向后兼容性的同时引入新的语言特性,他们需要确保新增的关键字不会与现有的代码产生冲突。为了解决这个问题,他们采用了一个巧妙的策略——使用以下划线开头的标识符。


根据C语言标识符的命名规则,以下划线开头的标识符通常被保留给实现使用,这意味着普通的程序员不应该在他们的代码中使用这样的标识符。通过这种方式,C语言标准委员会为自己预留了一个安全的命名空间,可以在其中引入新的关键字,而不必担心与现有代码发生冲突。
 

这种命名策略不仅解决了兼容性问题,还为程序员提供了一个视觉提示。当你在代码中看到以下划线开头的关键字时,你可以立即意识到这是一个相对较新的语言特性,可能需要更现代的编译器才能支持。

推荐阅读