如何在C++中更改变量的常量?

Sur*_*dhi 1 c++ const

以下是我的代码

const int i = 10;
cout<<i<<"\n";
int *ip = (int*)&i;
*ip = 20;
cout<<i<<"\n";
Run Code Online (Sandbox Code Playgroud)

我期待输出1020.
但我得到输出1010.

我能够编译程序,我没有在编译时或运行时得到任何错误,但没有得到预期的结果.如果我删除了变量i的常量,为什么新值没有分配给它?

如果有人能够解释发生了什么以及可以做些什么来实现我的预期结果,我将不胜感激.

Alo*_*ave 13

如何在C++中更改变量的常量?

您永远不应该更改固有const限定变量的常量!声明
一个const限定变量,目的是在初始化后不应修改它.通过尝试更改constness,您可以破坏与编译器的契约.

如果需要修改变量,只需将其声明为const.

请注意,C++提供const_cast了删除或添加常量的变量.但是,在删除constness时,它应该用于从引用/指针中删除constness,以指向原本不是常量的东西.


怎么了?

发生的事情是未定义的行为.

你不应该改变一个const合格变量的常量,如果你通过一些指针hackery这样做你得到的是未定义的行为.

在未定义行为的情况下,标准不要求编译器提供编译时诊断.请注意,如果您使用最高警告级别进行编译,某些编译器可能会发出警告.

此外,未定义的行为意味着当您运行程序时,任何事情都可能发生,编译器可能会向您显示任何结果,并且不保证解释.


结果如何呢?

在这种情况下,由于i常量可能是编译器将const变量作为其优化的一部分内联,因此指针hackery不会影响值,i因为它已经由编译器内联,它只是将内联值i放在代码中遇到的任何地方.

请注意,编译器这样做是因为您与编译器签订了合同,

继承我的i,在我的计划的整个生命周期中永远不会改变.

只要符合合同,编译器就可以自由地应用它想要的任何优化,并且在这种情况下它也是如此.