1

以下是我的代码

const int i = 10;
cout<<i<<"\n";
int *ip = (int*)&i;
*ip = 20;
cout<<i<<"\n";

我期待输出为1020
但我得到的输出为10and 10

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

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

4

1 回答 1

13

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

您永远不应该更改固有const限定变量的常量!
声明限定变量的const目的是在初始化后不应修改它。通过尝试更改常量,您违反了与编译器的合同。

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

请注意,C++ 提供了const_cast对变量删除或添加常量的功能。但是,在删除 constness 的同时,它应该用于从指向最初不是 constant的东西的引用/指针中删除 constness 。


怎么了?

正在发生的是未定义的行为

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

在未定义行为的情况下,该标准不强制编译器提供编译时诊断。请注意,如果您以最高警告级别编译,某些编译器可能会警告您。

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


为什么结果?

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

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

这是我i的,在我的程序的整个生命周期中永远不会改变。

编译器可以自由地应用它可能想要的任何优化,只要它遵守合同并且在这种情况下它会这样做。

于 2012-11-29T04:14:26.660 回答