首页  >  文章  >  后端开发  >  为什么通过非 const 指针修改 const 变量看起来有效,但实际上并没有改变它的值?

为什么通过非 const 指针修改 const 变量看起来有效,但实际上并没有改变它的值?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-28 08:35:02138浏览

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn't Actually Change Its Value?

通过非常量指针修改 const

在 C 中,const 变量一旦初始化就无法修改。但是,在某些情况下,const 变量可能会被更改。考虑以下代码:

<code class="cpp">const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

如果运行此代码,您会注意到意外的行为:

5
2

尽管 *w 在 (2) 中更改为 5, e 仍然保持其原始值 2。这种看似矛盾的行为源于以下因素:

  • (1) 取消引用 const 指针 (w) 允许修改。
  • (2 ) 修改后的值存储在 w 指向的内存位置,在本例中就是存储 e 的内存位置。
  • 但是,编译器优化了代码,将 e 视为编译时常量并且不在运行时对其求值。

因此,当在运行时求值 *w 时,它返回修改后的值 (5)。但是,当 e 在编译时求值时,将使用其原始值 (2)。

这种行为在 C 中称为未定义行为。直接或间接修改 const 变量会导致不可预测的后果,在这种情况下应谨慎行事。

以上是为什么通过非 const 指针修改 const 变量看起来有效,但实际上并没有改变它的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn