这段程序(某公司笔试题,女票找到的)的输出应该是啥呢?
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的介绍有好多,自认理解的没有这些大牛深,这里不再详细介绍。