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)内容基本相同,主要是格式组织不一样,所以它们实际上是同一套标准。
类别 | 关键字 | 说明 |
---|---|---|
数据类型 | 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 个关键字。
关键字 | 说明 |
---|---|
inline | 用于函数定义,建议编译器将函数代码直接插入到调用处,以提高程序执行效率。这个关键字主要用于优化小型、频繁调用的函数。 |
restrict | 用于指针声明,告诉编译器该指针是访问某一内存区域的唯一途径。这使得编译器可以进行更激进的优化,因为它可以确信不会通过其他途径修改该内存区域。 |
_Bool |
引入了布尔类型,可以存储 0(假)或 1(真)。这使得逻辑运算和条件判断更加清晰和直观。在使用时,通常会包含 |
_Complex | 用于声明复数类型。C99 标准引入了对复数的原生支持,使得科学计算和信号处理等领域的编程变得更加方便。 |
_Imaginary | 用于声明纯虚数类型。与 _Complex 配合使用,可以完整地表示复数系统中的所有数。 |
C11 标准
C11 标准由国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会于 2011 年底正式发布,主要增加了安全函数,以及对多线程的支持。
关键字 | 说明 |
---|---|
_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语言标准委员会为自己预留了一个安全的命名空间,可以在其中引入新的关键字,而不必担心与现有代码发生冲突。
这种命名策略不仅解决了兼容性问题,还为程序员提供了一个视觉提示。当你在代码中看到以下划线开头的关键字时,你可以立即意识到这是一个相对较新的语言特性,可能需要更现代的编译器才能支持。