文章目录
概要
C语言中有许多关键字,这些关键字不能作为标识符,以下是C89中所有的关键字:
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
这些关键字大致分为两大类:一类是数据类型的关键字、一类是流程控制的关键字。
技术名词介绍
数据类型的关键字有:void、char、int、float、double、short、long、signed、unsigned、struct、union、enum、typedef、sizeof、auto、static、register、extern、const、volatile、_Bool
流程控制类的关键字有:retur、continue、goto、break、if、else、switch、case、default、for、do、while
技术名词解释
一、数据类型关键字
基本数据类型(5个)
- void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
- char:字符型类型数据,属于整型数据的一种
- int:整型数据,通常为编译器指定的机器字长
- float:单精度浮点型数据,属于浮点数据的一种
- double:双精度浮点型数据,属于浮点数据的一种
类型修饰关键字(4个)
- short:修饰int,短整型数据,可省略被修饰的int。
- long:修饰int,长整形数据,可省略被修饰的int。
- signed:修饰整型数据,有符号数据类型
- unsigned:修饰整型数据,无符号数据类型
复杂类型关键字(5个)
- struct:结构体声明
- union:共用体声明
- enum:枚举声明
- typedef:声明类型别名
- sizeof:得到特定类型或特定类型变量的大小
存储级别关键字(6个)
- auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
- static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
- extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“
- const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
- volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
二、流程控制关键字
跳转结构(4个)
- return:用在函数体中,返回特定值(或者是void值,即不返回值)
- continue:结束当前循环,开始下一轮循环
- break:跳出当前循环或switch结构
- goto:无条件跳转语句
分支结构(5个)
- if:条件语句
- else:条件语句否定分支(与if连用)
- switch:开关语句(多重分支语句)
- case:开关语句中的分支标记
- default:开关语句中的“其他”分治,可选。
循环结构(3个)
- for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2…循环,其中2为循环条件
- do:do循环结构,do 1 while(2);的执行顺序是1->2->1…循环,2为循环条件
- while:while循环结构,while(1) 2;的执行顺序是1->2->1…循环,1为循环条件
小结
C语言中的关键字C99标准中有32个关键字
C99中新增了5个关键字
- _Bool
解释:
bool类型变量, 等价于 unsigned char . 只有0和1.其中0为假 1为真
- _Complex
解释:
对于C99 标准定义, 存在 float _Complex, double _Complex, long double _Complex 复数类型. 下面先演示gcc 中关于复数的用法.
- _Imaginary
解释:
虚数类型. _Complex 复数类型的虚部. 例如 10.0i, 10.8if 等等. 这个关键字在VS 上没有实现. 其实我也觉得没有必要.
和_Complex有重叠.
- inline
解释:
内联函数,从C++中引入的概念. 就是将小函数直接嵌入到代码中. C的代码损耗在于函数的进出栈. 要是可以推荐用内联函数
替代宏. 宏能不用就不用. 函数什么的时候不要加inline 需要加extern, 定义的时候需要加inline.
- restrict
解释:
这是很装逼的关键字用于编译器优化. 关键字restrict只用于限定指针;该关键字用于告知编译器,
所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;
这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
C11中新增了7个关键字
- _Alignas
解释:
内存对齐的操作符. 需要和_Alignof配合使用, 指定结构的对齐方式.
- _Alignof
解释:
得到类型和变量的对齐方式.
- _Atomic
解释:
原子操作, 原子锁. gcc 很早就支持
- _Generic
解释:
这个比较叼, C的泛函机制. 高级函数宏.
- _Noreturn
解释:
修饰函数,绝对不会有返回值. _Noreturn 声明的函数不会返回. 引入此新的函数修饰符有两个目的:
消除编译器对没有return的函数的警告.
允许某种只针对不返回函数的优化.
- _Static_assert
解释:
编译器期间断言, 当 #if #error 搞完毕(预编译)之后, 编译器断言. assert是运行时断言.用的时候看具体的需求.
- _Thread_local
解释:
C11为C引入了线程 在 头文件<threads.h>中定义.但也允许编译可以不实现.
_Thread_local是新的存储类修饰符, 限定了变量不能在多线程之间共享。
C11标准为C引入了线程和原子操作. 各种安全特性补充. 可以说C强大了.
但是还远远不够, 因为越来越丑了.