由一段程序引起的volatile认识

这段程序(某公司笔试题,女票找到的)的输出应该是啥呢?

int main()
{
    const int a = 10;
    int *p = (int*) &a;
    *p = 20;
    cout << a << ","<< *p<<endl;
    return 0;
}

编译错误??20 , 20 ??NO!!

答案是10, 20!!!惊呆了女票和我!

为毛?为嘛?为啥?

受高人指点,原因就是编译器优化!!!

原来因为a是const int, 编译器就默认a不会被改变,只要是a出现的地方,直接用10来替代。

虽然*p 通过(int*)&a指向了a在栈中的地址空间,并且通过*p = 20改变了其中的值,然而并没有卵用,在cout << a的时候编译器不会从a的地址处获取它的值,而是直接从寄存器中读取。

怎么解决呢??

const int a = 10;
改成
volatile const int a = 10;
就可以嘞!再次运行,结果变为了:20, 20。

关键字volatile的作用就是防止编译器优化,也就是说告诉编译器被我修饰的变量,只能从该变量的地址处获取其值,因为变量的值可能在你不知道的情况下发生改变。


详细的volatile的介绍有好多,自认理解的没有这些大牛深,这里不再详细介绍。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值