意外的输出

时间:2011-03-16 11:38:57

标签: c++ visual-c++ c++11 undefined-behavior

#include <iostream>

int main() 
{

    const int i=10;
    int *p =(int *) &i;
    *p = 5;
    cout<<&i<<" "<<p<<"\n";
    cout<<i<<" "<<*p;
    return 0;
}

输出:

0x22ff44 0x22ff44

10 5

请解释。

3 个答案:

答案 0 :(得分:12)

嗯,您的代码显然包含未定义的行为,因此任何事情都可能发生。

在这种情况下,我相信会发生什么:

在C ++中,const int被认为是编译时常量。在您的示例中,编译器基本上将您的“i”替换为数字10。

答案 1 :(得分:5)

您已尝试修改const对象,因此行为是 未定义。编译器有权假设const 对象的值不会改变,这可能解释了 你看到的症状。编译器也有权放置 只读内存中的const对象。它通常不会这样做 一个具有自动生命周期的变量,但是如果const有的话会很多 静态寿命;在这种情况下,程序将崩溃(在大多数情况下 系统)。

答案 2 :(得分:2)

我会考虑一下:因为输出没有逻辑上的原因,编译器必须优化那个可怜的cout<<i<<" "到一个简单的"cout<<"10 "。但这只是一种预感。

相关问题