【发布时间】:2014-10-10 03:19:54
【问题描述】:
我已阅读,在某些 C 标准中它是未定义的(可能是 99?)当 const 被修改时会发生什么。但是一个学生给了我一些代码,我修改了。
我看不出常量变量a 的地址有什么特别之处。我验证了&a 和b 是相同的,所以编译器并没有巧妙地指向其他位置。
然而,当我分配 *b 时,const 值并没有改变。
我没有进行优化。当我使用-g 标志进行编译以调试并单步执行代码时,我得到了我期望的结果(变量a 的内存位置发生了变化)。然而,下面显示的代码并未反映 a 的更新值。
这是不是即使在调试模式下,temps 现在也被放置在寄存器中,没有优化?
#include <iostream>
using namespace std;
int main(){
const int a = 15;
cout << a << '\n';
int * b= (int*)&a;
cout << &a << "\n";
cout << b << "\n";
*b = 20;
cout << *b << '\n';
cout << a << '\n';
int x = a;
cout << x << '\n';
x = *b;
cout << x << '\n';
return 1;
}
【问题讨论】:
-
所以您承认这是未定义的行为,但随后您问为什么它的行为不像您预期的那样(不管是什么)?根据定义,“未定义的行为”意味着该行为不必有意义。
-
我希望如果我写入一个内存位置,并且如果一个变量代表那个内存位置,那么我会成功地创建一个错误。如果代码经过优化并将值放在其他地方(如寄存器),那么我会理解这种机制。我想询问变量的地址并没有真正得到尊重,因为它是 const。
-
我们看到很多关于 SO 的未定义行为问题,我认为社区有时对它们的反应是不幸的。这不是一个典型的问题,有时像Deep C presentation does 这样在引擎盖下达到顶峰可以提供信息。
标签: c++ pointers constants undefined-behavior constantfolding