#include <iostream>
int main()
{
const int i=10;
int *p =(int *) &i;
*p = 5;
cout<<&i<<" "<<p<<"\n";
cout<<i<<" "<<*p;
return 0;
}
输出:
0x22ff44 0x22ff44
10 5
请解释。
答案 0 :(得分:12)
嗯,您的代码显然包含未定义的行为,因此任何事情都可能发生。
在这种情况下,我相信会发生什么:
在C ++中,const int被认为是编译时常量。在您的示例中,编译器基本上将您的“i”替换为数字10。
答案 1 :(得分:5)
您已尝试修改const对象,因此行为是 未定义。编译器有权假设const 对象的值不会改变,这可能解释了 你看到的症状。编译器也有权放置 只读内存中的const对象。它通常不会这样做 一个具有自动生命周期的变量,但是如果const有的话会很多 静态寿命;在这种情况下,程序将崩溃(在大多数情况下 系统)。
答案 2 :(得分:2)
我会考虑一下:因为输出没有逻辑上的原因,编译器必须优化那个可怜的cout<<i<<" "
到一个简单的"cout<<"10 "
。但这只是一种预感。