关键字

来源:互联网 发布:网络延时与网速有关吗 编辑:程序博客网 时间:2024/06/07 10:24

关键字包括register,static,const,typedef,extern

register

含义:是寄存器变量 
作用:请求编译器尽可能的将这个变量值保存在CPU内部的寄存器内,以节省CPU从内存中抓取数据的时间,提高代码的运行效率 
适用变量:频繁被访问的变量,如循环变量 
注意事项:1、只能修饰局部变量,而不能修饰全局变量或函数 2、不能通过取地址来得到变量的地址 3、修饰的变量一定要是CPU所能接受的数据类型

注释: 
1、为何要尽可能的保存在寄存器内:因为CPU内部的寄存器有限,是稀缺资源

2、为何不能修饰全局变量:因为全局变量是会被多线程或多任务访问的,而被register访问的变量只有本进程知道变量保存在哪儿

3、为何不能取地址:因为变量此时保存在寄存器里,得到的地址是寄存器的地址。

static

含义:静态变量 
修饰对象:可以修饰全局变量,也可以修饰局部变量,还可以修饰函数 
作用 
修饰局部变量的作用:延长他的生命周期,使得原本函数结束就要被释放的变量能够在程序结束之后再释放。 
修饰全局变量的作用:使得该变量只能在本文件中被使用,并将全局变量保存在静态数据区,默认初始化为0 
修饰函数的作用:使得该函数只能在本文件中被访问

何时修饰 
何时修饰局部变量:想延长他的生命周期,让她程序结束后再释放,而将它修饰为静态局部变量又安全于全局变量 
何时修饰全局变量:想让他只在本文件中被访问,并且可以重命名

注释: 
1、如果另一函数a.c要调用本函数b.c的全局变量,则可以在a.c里加上

extern + 数据类型 + 变量名

因为extern的作用是外部声明。

2、被static修饰的函数,如果定义在一个未被修饰的函数后面。则先要在这个未被修饰的函数前面加上被修饰函数的声明。

3、为何想让变量在程序结束后释放,而不用全局变量呢:因为全局变量比较危险,对所有人都可见,而静态局部变量更安全

const

含义:是一个只读变量 
注释:const修饰的是一个变量名,所以变量名对应的空间可变而不能通过变量名来修改这个空间

作用:使其修饰的变量名不能修改此空间,而其空间通过其他方式可以改变 
注释:const离谁近,谁不能自加。

<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> num = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>;const <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*p</span> = &num;p++;(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*p</span>)++;num++;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

此时const修饰的是*p,所以 (*p)++不可以实现。 
因此,const int *p 和int const *p不可以实现(*p)++ 
而int * const p不可以实现p++

修饰对象:变量及形参 
注释:防止实现函数过程中,会修改实参的值

注意事项:一定要将变量初始化,不然以后无法赋值

typedef

含义:给数据类型重命名 
作用:1、提高代码移植性 2、将复杂名变为简单名,方便编写程序 3、同时也能起注释作用

volatile

含义:修饰被不同线程访问和修改的变量。 
注释:如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

作用:确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 
简单地说就是防止编译器对代码进行优化.比如如下程序:

<code class="hljs ini has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-setting" style="box-sizing: border-box;">XBYTE[2]=<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x55;</span></span><span class="hljs-setting" style="box-sizing: border-box;">XBYTE[2]=<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x56;</span></span><span class="hljs-setting" style="box-sizing: border-box;">XBYTE[2]=<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x57;</span></span><span class="hljs-setting" style="box-sizing: border-box;">XBYTE[2]=<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x58;</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).

0 0
原创粉丝点击