#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
请解释。
#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
请解释。
您试图修改一个const对象,所以行为是 未定义。编译器有权假定const 对象的值不会更改,这可能会解释您看到的 症状。编译器也有权将const对象放在只读存储器中。对于 而言,它通常不会为自动生存期的变量这样做,但如果const具有 静态生命周期,则会发生很多变化;在这种情况下,程序将崩溃(在大多数 系统上)。
那么,你的代码显然包含未定义的行为,所以任何事情都可能发生。
在这种情况下,我相信会发生什么情况是这样的:
在C++中,常量整数被认为是编译时间常数。在你的例子中,编译器基本上用数字10替换你的“我”。
确实:)固定。 – hrnt 2011-03-16 11:46:06
关闭...它将字面值“10”替换为“i”,并导致[鼻腔恶魔飞出你的鼻子](http://groups.google.com/group/comp.std.c/ msg/dfe1ef367547684b?pli = 1)遇到'* p = 5'时。 – 2011-03-16 11:47:15
我会试试看:因为没有合理的输出结果,编译器必须优化cout<<i<<" "
,以便简单"cout<<"10 "
。但这只是一种预感。
这不仅仅是一种预感。函数的第一行说我是不变的,所以它当然总是有10的值。(下一行然后使得程序不起作用)。 – 2011-03-16 12:01:26
删除'c'标记。你的程序不能用C编译器编译:''不被识别,'<<'的用法都是错误的。除了'const'对C或C++来说意味着不同的东西:它们是不同的语言 –
pmg
2011-03-16 11:44:32
当常量不是常量时,它不是很好吗 – 2011-03-16 11:46:57
@pmg他的程序显然不是C,但const的含义是在两种语言中都是相同的(至少当应用于通用子集时,就像这里的情况一样)。 – 2011-03-16 11:52:23