2

必须遵循代码 -

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

它给出输出7 ,即该行*((int*) pWeekdays) = 9;无效或抛出任何错误。

显然它喜欢这样做7 = 9,为什么没有抛出错误?

4

2 回答 2

6

抛弃 const 并因此可变地访问 const 对象是简单的未定义行为。你的程序可以做它想做的任何事情,并且不需要诊断。

永远记住,虽然崩溃的程序确实有错误,但有错误的程序并不总是崩溃。(或者正如苏格拉底所说,“不是每只猫都是鱼”。)


在 C++ 中,你真的不应该使用 C 风格的强制转换。如果您尝试了更合适的static_cast<int*>(pWeekdays)方法,您将得到正确的诊断。

于 2012-08-28T17:40:43.597 回答
0

您已定义WEEKDAYS为常量,并且您正在更新*pWeekdays存储在地址中的值pWeekdays,因此从技术上讲,您不会更新常量。

您定义为的参考WEEKDAYS或未更新pWeekdaysconstant

于 2012-08-28T17:43:19.183 回答