C++ const指针 - 不明原因的行为

goo*_*ons 2 c++ pointers reference

我有这段代码:

const int x = 7;
const int &y = x;

int *z = (int*)&y;
*z = 8;

cout << x<< endl;
cout << y<< endl;
cout << *z<< endl;
Run Code Online (Sandbox Code Playgroud)

其中产生以下输出:

7
8
8
Run Code Online (Sandbox Code Playgroud)

我知道不应该像上面那样删除const.但是,为什么x打印7?我只创建了一个var,所以如果输出显示7和8,那么应该创建2个vars.怎么会有2个不同的数字打印出来.

Mar*_*ica 8

我知道不应该像上面那样删除const.

对.这样做是未定义的行为,这意味着任何事情都可能发生.(更准确地说,创建z不是未定义的行为; x通过它进行修改是.)

但是,为什么x打印7?我只创建了一个var,所以如果输出显示7和8,那么应该创建2个vars.怎么会有2个不同的数字打印出来.

关于未定义行为的推理很奇怪 - 但是理解调试目的所发生的事情会很有用.在这种情况下,几乎可以肯定的是,编译器已经优化:

cout << x<< endl;
Run Code Online (Sandbox Code Playgroud)

cout << 7 << endl;
Run Code Online (Sandbox Code Playgroud)

因为没有办法可以合法地修改x的值.然后,您可以非法修改x的值,并设法打印出新值.

重要的提示

不要试图依赖这种行为; 正如我上面所说,它仅用于调试目的.如果编译器更改它可能会在优化时变得更好并且只为所有值打印7(因为*z = 8是未定义的行为),或者它可能放入x只读内存(并导致访问冲突),或者它可能最终为所有值打印8值或其他任何可能发生的事情.