2011-03-16 126 views
1
#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

请解释。

+0

删除'c'标记。你的程序不能用C编译器编译:''不被识别,'<<'的用法都是错误的。除了'const'对C或C++来说意味着不同的东西:它们是不同的语言 – pmg 2011-03-16 11:44:32

+0

当常量不是常量时,它不是很好吗 – 2011-03-16 11:46:57

+0

@pmg他的程序显然不是C,但const的含义是在两种语言中都是相同的(至少当应用于通用子集时,就像这里的情况一样)。 – 2011-03-16 11:52:23

回答

5

您试图修改一个const对象,所以行为是 未定义。编译器有权假定const 对象的值不会更改,这可能会解释您看到的 症状。编译器也有权将const对象放在只读存储器中。对于 而言,它通常不会为自动生存期的变量这样做,但如果const具有 静态生命周期,则会发生很多变化;在这种情况下,程序将崩溃(在大多数 系统上)。

12

那么,你的代码显然包含未定义的行为,所以任何事情都可能发生。

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

在C++中,常量整数被认为是编译时间常数。在你的例子中,编译器基本上用数字10替换你的“我”。

+0

确实:)固定。 – hrnt 2011-03-16 11:46:06

+3

关闭...它将字面值“10”替换为“i”,并导致[鼻腔恶魔飞出你的鼻子](http://groups.google.com/group/comp.std.c/ msg/dfe1ef367547684b?pli = 1)遇到'* p = 5'时。 – 2011-03-16 11:47:15

2

我会试试看:因为没有合理的输出结果,编译器必须优化cout<<i<<" ",以便简单"cout<<"10 " 。但这只是一种预感。

+0

这不仅仅是一种预感。函数的第一行说我是不变的,所以它当然总是有10的值。(下一行然后使得程序不起作用)。 – 2011-03-16 12:01:26