1、register
作用:
修饰寄存器变量,变量可能放到CPU内部寄存器中,运行优化提高运行效率。不能修饰函数、全局变量
使用场景:频繁访问的变量,可以优化运行速率。
注意事项:
(1)不能修饰全局变量()
(2)不能通过&来获取register来获取修饰变量的地址(CPU内部寄存器地址不允许随意访问)
(3)修饰的类型必须是CPU能处理的类型
2、volatile(易变的,反复无常的)
作用:修饰全局变量,防止编译器优化,告诉编译器该变量可能随时发生变化
3、static(修饰静态变量)
既能修饰局部变量(保存在静态数据区),也能修饰全局变量/函数,修饰的函数要放在最前面
(1)修饰局部变量:延长局部变量的生命周期,但只执行一次,到程序结束后释放(代替全局变量)
(2)修饰全局变量/函数:只能在本文件的函数被调用,限定作用域,方便开源代码的合作开发,防止命名冲突
只在当前文件用加static,给外部文件用不加
4、extern
在当前文件访问其他文件的全局变量或函数(当前文件没有这个函数),用在变量或函数的声明前,用来说明此变量变量/函数在别处定义,要在此处引用(声明)
优点:
(1)加强编译速度
(2)在工程多个文件共同使用全局变量时进行声明不报错
(3)在同一文件中的函数不要用声明,不然编译时会先到外找这个函数再回到该文件找这个函数
5、const
修饰变量(局部、全局)只读变量,在程序运行期间它的值不能别修改,在运行阶段时用
注意:不能通过变量名来更改变量的内容,但对应空间是可变的(通过修改地址来修改内容)
使用场景:修饰函数的形参提供安全的访问接口函数,防止函数实现过程中修改实参变量的接口
例:
(1) const int *p = &count //不能通过p修改p 指向的内存空间
(2) int const *p = &count //不能通过p修改p 指向的内存空间
(3) int *const p = &count //不能通过p修改p 对应的内存空间
(4) const int *const p = &count // 不能修改
总结:距离谁近谁不能修改
6、typedef
给数据类型重命名,不是创造新类型
作用:
(1)解决不同编译器默认数据signed、unsigned的问题,提高代码的移植性
(2)简化拼写,提高编码效率
(3)改变原有代码标识,提高代码可读性
注意:给函数指针重命名
typedef int(*p_FUNC)(int,int)
typedef int (*)(int,int) _FUNC X
7、inline
作用:把函数指定为内嵌函数,用空间换运行速度,和register一样只是向CPU请求,CPU判断后决定是否执行
原理:编译阶段处理,只编译函数头部,在调用点将代码展开。与函数相比减少了调用函数、返回函数、分配空间、释放空间的开销,但在调用处将文件展开,占用内存
特点
以空间换时间,以代码膨胀为代价,减去了函数开栈清栈的过程(调用函数会跳转到函数体里,这就要在内存上开栈,压参,读取指令,完了清栈。因为inline是在调用点将代码展开,所以不会跳转,只会在调用点这个函数的栈上操作)。
注意:在调用内联函数时,要保证内联函数的定义让编译器看到,即内联函数必须放在头文件中!!!
转载:
C语言关键字复习——define不是关键字,sizeof是关键字,不是函数_aɪs kri:m的博客-CSDN博客_define是c语言关键字吗
8、#define与typedef
(1)define预处理时进行替换,typedef是在编译时起作用
(2)define 预处理指令,只做简单替换,没有语法检查,不能保证定义的变量为同一类型,typedef是关键字,编译时做类型检查,可以定义变量为同一类型
例:
define INTPTR1 int*
tyeped int* INTPTR2
INTPTR1 p1,p2;//相当于 int*p1,p2;一个整形指针p1,一个整形变量
INTPTR2 p1,p2;//定义两个整形指针
(3)作用域不同,#define没有作用域的限制
9、#define与const
const关键字,在编译时作用,作类型检查
const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
10、#define与inline
inline关键字,在编译时作用,作类型检查
11、关键字、操作符和函数的区别
(1)关键字
所谓关键字就是已被语言本身使用, 不能作其它用途使用的字。
(2)操作符
操作符是在表达式中用于连接不同对象的运算符,不同的操作符指定了不同的运算方式。可以把操作符理解为语言内置的,最基础的函数,不可代替的函数!操作符本质上也是函数。只是操作符是编译器需要进行进一步解释。
(3)函数
函数是一组一起执行一个任务的语句
(4)函数与操作符区别:
a/运算符只能重载,不能自定义,函数的名字随便起,只要是个标识符就行;但运算符不行。
b/函数本身有一段代码,程序执行时,遇到函数时,会先将函数的参数入栈,再跳到函数的代码来运行。而操作符则是在本地直接运算。
原文链接:https://blog.csdn.net/farmwang/article/details/78003603