C语言的关键字共有32个。
一、数据类型关键字(12个):
关键字 |
作用 |
char |
声明字符型变量或函数 |
double |
声明双精度变量或函数 |
float |
声明浮点型变量或函数 |
int |
声明整型变量或函数 |
short |
声明短整型变量或函数 |
long |
声明长整型变量或函数 |
signed |
声明有符号类型变量或函数 |
unsigned |
声明无符号类型变量或函数 |
void |
声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) |
enum |
声明枚举类型 |
struct |
声明结构体变量或函数 |
union |
声明联合数据类型 |
二、控制语句关键字(12个):
分类 |
关键字 |
作用 |
循环语句 |
for |
一种循环语句(可意会不可言传) |
do |
循环语句的循环体 |
|
while |
循环语句的循环条件 |
|
break |
跳出当前循环 |
|
continue |
结束当前循环,开始下一轮循环 |
|
条件语句 |
if |
条件语句 |
else |
条件语句否定分支(与 if 连用) |
|
goto |
无条件跳转语句 |
|
开关语句 |
switch |
用于开关语句 |
case |
开关语句分支 |
|
default |
开关语句中的“其他”分支 |
|
return |
子程序返回语句(可以带参数,也看不带参数) |
三、存储类型关键字(4个)
关键字 |
作用 |
auto |
声明自动变量一般不使用 |
extern |
声明变量是在其他文件中声明(也可以看做是引用变量) |
register |
声明寄存器变量 |
static |
声明静态变量 |
四、其他关键字(4个)
关键字 |
作用 |
|
const |
声明只读变量 |
常量修饰符,类型限定词 |
sizeof |
计算数据类型长度 |
|
typedef |
用以给数据类型取别名(当然还有其他作用) |
存储类关键词 |
volatile |
说明变量在程序执行中可被隐含地改变 |
类型修饰符(type specifier),指令关键字。 |
Volatile:应该解释为“直接存取原始内存地址”比较合适。作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
使用地方:
1、中断服务程序修改的供其他程序检测的变量需要加volatile
2、多任务环境下各任务间共享的标志应该加volatile
3、存储器映射的硬件寄存器通常要加volatile,因为每次对它的读写都可能有不同意义
Const:
要求它所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值
1、 可以定义const常量,具有不可变性。
2、 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患
使用地方:
1、 在函数声明时修饰参数
memmove(void *dst, const void *src, size_t len);
Static:
1、 static修饰一个函数,则这个函数只能在本文本中调用,不能被其他文件调用。
2、 static修饰局部变量,则这个局部变量存放在全局数据区的静态变量区,初始化时自动初始化为0。初始化操作只执行一次;这个局部变量的生命周期延长,直到程序运行结束以后才释放。
3、 static修饰全局变量,则这个全局变量只能在本文件中访问,不能在其他文件中访问。即便是extern外部声明也不可以。
Typedef:
1、 typedef没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。
2、 与#define不同,typedef创建的符号名只受限于类型,不能用于值
3、 typedef由编译器解释,不是预处理器
4、 定义函数指针
typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这
种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。
typedef VOID (*oal_callback_t)(VOID); //定义一类函数指针, 该类指针指向的函数入参和返回值都为空
inline 内联函数
在C语言中,如果一些函数被频繁调用,不断有函数入栈,即函数栈,会造成栈空间的大量消耗。
1、 关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。
2、 inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
3、 内联是以代码膨胀(复制)为代价。仅仅省去了函数调用的开销,从而提高函数的执行效率。
4、 每一次内联函数的调用都要赋值代码,将使程序的总代码量增大,消耗更多的内存空间。