有人向我展示了以下代码段并询问它应该输出什么
#include <iostream>
using namespace std;
int main() {
const int value = 10;
int* p = (int*)&value;
*p = 20;
cout << value << " " << *p << endl
<< &value << " " << p << endl;
return 0;
}
正如您所看到的,有一个常量value
为10,并且指针p
指向值的地址,然后指向的地址获得不同的值。
我希望程序能够打印20 20
but it actually prints 10 20
.
它还表明这两个贵重物品具有相同的地址。有人可以解释幕后发生的事情吗?
答案 0 :(得分:3)
未定义的行为和优化编译器。编译器知道来自value
的声明,value
的值在格式良好的程序中永远不会改变,因此它优化了位其中value
的值将被检查,并且只获取它所知道的值value
。
至于地址,您永远不会使用p
的地址,并且p
与&value
的地址相同并不奇怪,因为您之前已将其分配了几行。