C++代码如下:
const int a=9;
int *p=(int*)&a;
*p=10;
printf("a: %d , *p %d",a,*p); //a: 9 ,*p: 10
为什么*p改变了,但是a没有改变呢?(g++)
(
google:常量折叠.
源于编译器的优化.因为是常量,会直接当作常数输出,不会检测你是否改变了他.
加上volatile:
volatile const int a = 9;//这样的话就会按你想的输出了
)
因为常量折叠,C++编译器会把这个常量 a 当作是9,a这个变量就相当于不存在了,但是它还是真的存在的。呵呵。
所以呢,其实*p改变了a的值,只要我们 volatile,让编译器不要优化我们的const 常量即可。优化后不会去真实地址查看其值是否改变,加了volatile就会每次去真实地址提取值
比如: const int a=9;cout<<a<<endl; 优化后: cout<<9<<endl; 则a相当于不存在了。哈哈
(有人说: 呵呵
最后给楼主一句忠告:不要(通过各种“诡异”的方法)修改常量的值,否则程序行为未定义。
)
真好,又学到了一点点知识。