当我通过指针修改const变量时,为什么原始值没有更新?

时间:2014-07-10 14:58:41

标签: c++ const undefined-behavior

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

#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

1 个答案:

答案 0 :(得分:3)

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

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

std::cout << 7;

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

但是这种行为仍未定义。根本没有理由这么做。