【问题标题】:When I modify a const variable via a pointer, why is the original value not updated? [duplicate]当我通过指针修改 const 变量时,为什么原始值没有更新? [复制]
【发布时间】:2014-07-10 14:58:40
【问题描述】:

我的教授给了我这段代码,并告诉我它有“未定义的行为”:

#include <iostream>

int main()
{

    const int WEEKDAYS = 7;
    const int *pWeekdays = &WEEKDAYS;
    *((int*)pWeekdays) = 9;
    std::cout << WEEKDAYS;
    std::cout << *pWeekdays;

    return(0);
}

它给出以下输出:

79

我正在尝试理解以下内容:

  1. 为什么行为未定义?
  2. 为什么打印*pWeekdays 输出9 但打印WEEKDAYS 输出7

【问题讨论】:

  • 您有未定义的行为。你不能指望这段代码做任何可靠的事情。
  • 修改a const is undefined behavior,很可能因为它是一个常量,编译器正在用文字替换它,甚至不评估变量。
  • @juanchopanza 我的教授这样称呼它......但我不明白这两个变量的行为。
  • 这是一个有趣的问题,虽然它是重复的,但不赞成将代码作为图像发布。
  • 唯一要了解的是程序可以为所欲为。您可以在您的特定平台上查看此代码生成的汇编代码,以确切了解发生了什么。

标签: c++ constants undefined-behavior


【解决方案1】:

您的行为未定义,因为您正在修改声明为 const 的对象。你不能这样做。

这是未定义行为的原因是允许编译器执行优化,在这种情况下它似乎正在这样做。它已将 WEEKDAYS 的所有实例替换为值 7,因此第一行 cout 变为:

std::cout << 7;

这就是为什么无论您对pWeekdays 指向的对象做什么,它都会打印7

尽管如此,这种行为仍然是未定义的。它根本没有理由这样做。

【讨论】:

  • 谢谢你让我大开眼界。
猜你喜欢
  • 2016-05-25
  • 2019-12-06
  • 2015-01-07
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多