以下是我的代码
const int i = 10;
cout<<i<<"\n";
int *ip = (int*)&i;
*ip = 20;
cout<<i<<"\n";
我期待输出为10
和20
但我的输出结果为10
和10
。
我能够编译程序,我在编译时或运行时没有得到任何错误,但没有得到预期的结果。如果我删除了变量i的常量,为什么新值没有分配给它?
如果有人能够解释发生了什么以及可以采取哪些措施来实现我的预期结果,我将不胜感激。
答案 0 :(得分:13)
如何在C ++中更改变量的常量?
您永远不应该更改固有const
限定变量的常量!
声明了const
限定变量,目的是在初始化后不应修改它。通过尝试更改constness,您可以破坏与编译器的契约。
如果您需要修改变量,只需将其声明为const
即可。
请注意,C ++提供const_cast
来删除或添加常量变量。但是,在删除constness的同时,它应该用于从参考/指针移除constness到原来不是的东西。
发生了什么事?
正在发生的是未定义的行为。
你不应该改变const
限定变量的常量,如果你通过一些指针hackery这样做,你得到的是未定义的行为。
如果未定义的行为,标准不要求编译器提供编译时诊断。请注意,如果您使用最高警告级别进行编译,某些编译器可能会发出警告。
此外,未定义的行为意味着当您运行程序时,任何事情都可能发生,并且编译器可能会向您显示任何结果,并且不保证解释。
结果为什么?
在这种情况下,由于i
是常量,编译器可能会将const变量作为其优化的一部分进行内联,因此指针hackery不会影响i
的值,因为它已经由编译器内联只需在代码中遇到i
的地方放置内联值。
请注意,编译器这样做是因为您与编译器签订了合同,
继承我的i
并且在我的计划的整个生命周期内永远不会更改。
只要符合合同,编译器就可以自由地应用它想要的任何优化,并且在这种情况下也是如此。