C语言 关键字

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值