【整理自用】c++常量折叠(const int 到底能不能被修改)

知识点来源于c++常量折叠
首先,先看牛客网上c++的一道题目:

在c++中,以下程序代码输出是? 答案是 (0, 1)

const int i = 0; 
int *j = (int *) &i; 
*j = 1; 
printf("%d,%d", i, *j)

就感觉很神奇, j j 指向的是i所在的位置,如果能够这样强制修改,那么const的作用就不复存在了,但是如果不可以修改,那么感觉强制类型转换后让 j j 指向它就不应该允许通过。但是,c++并没有这样严谨的处理,而简单采用了一种叫做c++常量折叠的方式。


  1. const int i = 0; 定义完成i就应该类似宏定义一样,变为一个固定的常量。从此以后,作用域见到 i i 就是0。
  2. 但是 i 毕竟是一个变量,c++为其分配了一个空间。而只有是有空间的,就意味着人总有办法搞到该地址然后偷偷去读去写。c++管不了这个,所以只能偷懒,那就是cpu默认只读取一次变量 i i 的值,后面即使它被修改,cpu也假装不知道,继续用之前的值。

但是问题来了,如果在const int定义的变量前面强行加上一个violatile,也就是说强行让cpu在以后使用i之前必须要从寄存器中读取新的值,那么这道题的答案就是1,1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值