博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C语言】深入理解const,volatile,static关键字
阅读量:2489 次
发布时间:2019-05-11

本文共 934 字,大约阅读时间需要 3 分钟。

我们先来看一段代码:

#include 
int main(){const int n = 10;int *p = (int *)&n;*p = 20;printf("%d\n", n);return 0;}

//看看程序输出的结果是什么?

 

只要编译器适当的对代码进⾏优化,这⾥就可能输出: 10,⽽不是我们改变之后的值。

这是为什么呢?
是编译器在编译期间,可能对代码进⾏优化。
当编译器看到这⾥的num被const修饰,从语义上讲这⾥的num是不期望被改变(不改变)
的,那优化的时候就可以把num的值存放到寄存器(以提⾼访问的效率)中。以后只要使⽤
num的地⽅都去寄存器中取,那即使num对应的内存中的值发⽣变化,寄存器也是感知不到

的。所以造成输出10的结果。

当我们对代码进⾏如下修改:

const的深度讲解及volatile关键字介绍
 

#include 
int main(){//使⽤volatile关键字对num修饰。volatile const int n = 10;int *p = (int *)&n;*p = 20;printf("%d\n", n);return 0;}

结果⼜会是什么呢?

这⾥我们可以看到,当我们对*p做了修改之后, num的输出变成了20。
这⾥ volatile 这个关键字起到关键的作业。
那我们说说 volatile 关键字的作⽤和使⽤场景。
 

volatile作⽤:

编译时不优化,执⾏时不缓存,每次需从内存中读出(保证内存的可⻅性)。
场景:
⽤于多线程或多CPU编程。
如果不显示的初始化,静态变量的初始化为0
⽽⾃动变量是不做任何初始化的,是随机值

程序运行结果:

static的总结:

1. 当它作⽤于函数定义时,或者⽤于代码块之外的变量声明时, static关键字⽤于修改标示符

的链接属性。外部链接属性变为内部链接属性,标识符的存储类型和作⽤域不受影响。也就
是说变量或者函数只能在当前源⽂件中访问。不能在其他源⽂件中访问。
2. 当它⽤于代码块内部的变量声明时, static关键字⽤于修改变量的存储类型。从⾃动变量变
为静态变量
。变量的属性和作⽤域不受影响。

你可能感兴趣的文章
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>
乙未年年终总结
查看>>
子网掩码
查看>>
第一天上班没精神
查看>>
启动eclipse报错:Failed to load the JNI shared library
查看>>
eclipse安装插件的两种方式在线和离线
查看>>
linux下源的相关笔记(suse)
查看>>
linux系统分区文件系统划分札记
查看>>
Linux(SUSE 12)安装Tomcat
查看>>
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>
Overlay之VXLAN架构
查看>>
Eclipse : An error occurred while filtering resources(Maven错误提示)
查看>>
在eclipse上用tomcat部署项目404解决方案
查看>>
web.xml 配置中classpath: 与classpath*:的区别
查看>>
suse如何修改ssh端口为2222?
查看>>
详细理解“>/dev/null 2>&1”
查看>>