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个不同的数字打印出来.
我知道不应该像上面那样删除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值或其他任何可能发生的事情.
归档时间: |
|
查看次数: |
80 次 |
最近记录: |