以下是我的代码
const int i = 10;
cout<<i<<"\n";
int *ip = (int*)&i;
*ip = 20;
cout<<i<<"\n";
我期待输出为10
和20
。
但我得到的输出为10
and 10
。
我能够编译程序,并且在编译时或运行时没有收到任何错误,但没有得到预期的结果。如果我删除了变量 i 的常量,为什么不给它分配新值?
如果有人能解释发生了什么以及可以做些什么来达到我的预期结果,我将不胜感激。
如何在 C++ 中更改变量的常量?
您永远不应该更改固有const
限定变量的常量!
声明限定变量的const
目的是在初始化后不应修改它。通过尝试更改常量,您违反了与编译器的合同。
如果您需要修改变量,只需不要将其声明为const
.
请注意,C++ 提供了const_cast
对变量删除或添加常量的功能。但是,在删除 constness 的同时,它应该用于从指向最初不是 constant的东西的引用/指针中删除 constness 。
怎么了?
正在发生的是未定义的行为。
你不应该改变一个const
合格变量的常量,如果你通过一些指针黑客这样做,你得到的是未定义的行为。
在未定义行为的情况下,该标准不强制编译器提供编译时诊断。请注意,如果您以最高警告级别编译,某些编译器可能会警告您。
此外,未定义的行为意味着当您运行程序时,任何事情都可能发生,编译器可能会向您显示任何结果,并且不需要解释。
为什么结果?
在这种情况下,因为i
是常量,编译器可能会将 const 变量内联作为其优化的一部分,因此指针hackery 不会影响值,i
因为它已经被编译器内联,它只是将内联值i
放在代码中遇到的任何地方。
请注意,编译器这样做是因为您与编译器签订了合同,
这是我i
的,在我的程序的整个生命周期中永远不会改变。
编译器可以自由地应用它可能想要的任何优化,只要它遵守合同并且在这种情况下它会这样做。