(面试)C语言中关键字的总结

来源:互联网 发布:黄思路韩寒 知乎 编辑:程序博客网 时间:2024/06/05 10:21


C语言中有很多的关键字,有register,static,const,extern,typedef,很多人可能只知道其表面含义,对其中的用法理解还不到位,希望这篇文章能帮助你:

    1.register关键字

Register关键字的作用:register为寄存器变量,简单来说,计算机一般是由CPU,内存,和硬盘组成的,而cpu是由运算器,控制器,存储器组成的,而register关键字的作用是请求编译器尽可能将变量存在CPU内部寄存器中,从而省去CPU从内存抓取数据的时间,从而提高执行效率。但由于内部寄存器为稀缺资源,不可能将所有变量都放在寄存器中,一般来说,可将频繁被访问的变量(循环变量)放于寄存器中。

使用register注意以下几点:

(1)、register只能修饰局部变量,不可修饰全局变量或函数;

原因:全局变量被多个进程访问,修饰为register只有当前进程知道保存于何处,其他进程无从知晓。

(2)、不能用&获取register变量地址

   原因:&获取的是内存地址,而register变量保存的是寄存器的地址;

(3)、register只修饰CPU所能接受的数据类型;

2、static关键字

Static既可以修饰变量,又可修饰函数,修饰变量时,既可以修饰全局变量,又可以修饰局部变量;修饰局部变量时,延长局部变量生命周期,直至程序结束释放;修饰全局变量时,只能在本文件中可见,其他文件不可见;修饰函数时,只能在本文件中被调用,其他文件中不能调用;

Static修饰的变量全部保存在数据区的静态数据区,若未初始化,系统默认为初始化为0

何时使用static修饰呢?

(1).想让一个变量在程序执行完才释放,用static,只在本文件可见,全局比较危险;

(2).static修饰全局变量,用static只可在本文件使用,在其他文件中可使该变量重新命名;

(3).修饰函数,起到保护作用;

Const关键字

1、const修饰变量时,使该变量为只读变量,即const修饰的该变量,虽然空间可变,但是不能通过修饰的变量名修改空间。

2、用const修饰形参的作用:防止函数实现过程中修改实参的值,一旦被修改,立刻报错,便于调制。

Typedef关键字

作用:给数据类型重起名字;

其优势为:1.提高程序的移植性;

          2.方便定义变量,把复杂名字变为简单名字,提高编码效率

          3.解释某些变量的含义。

Volatile关键字

作用:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

 

Volatile的本意是易变的,当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

volatile对应的变量可能在你的程序本身不知道的情况下发生改变比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量你自己的程序,是无法判定何时这个变量会发生变化.还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。

 

对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile

2、多任务环境下各任务间共享的标志应该加volatile

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2 中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

0 0
原创粉丝点击