读书人

一个关于const的有关问题同几个地址

发布时间: 2012-04-06 12:22:24 作者: rapoo

一个关于const的问题,同几个地址,加不加const居然不一样?!!
在DEV-CPP上运行如下代码,感到结果非常不可思议,请高手指教
#include <iostream>
using namespace std;
int main()
{
const int ten=10;
int *p;
p=(int *)&ten;
(*p)++;
cout < <ten < <endl; //ten is 10
cout < <&ten < <endl; //&ten is 0x22ff74
cout < <p < <endl; //p is 0x22ff74
cout < <*p < <endl; //*p is 11
cout < <*(&ten) < <endl; //*(&ten) is 10
cout < <*(int *)(&ten) < <endl; //*(int *)(&ten) is 11
cout < <*(const int*)p < <endl; //*(const int*)p is 11
return 0;
}
想不明白为什么同一个地址,用两种不同的类型输出,会得到不同的结果??
(也并非完全如此,&ten转int *是11,p转const int*却不发生变化)
请高手解释一下吧!

[解决办法]
我测试了一下,你的程序是用*p修改了const int ten的值。

cout < <ten < <endl;
这句的输出之所以没有+1是因为它读出的并不是内存中的值而是在缓存里的值。

你写成
const volatile int ten=10;
程序就会按照你所想的那样运行了。
[解决办法]
常量折叠
对于cout < <ten;函数调用时直接用10入栈了,并没有使用相应内存中的值.
[解决办法]
pushl%ebp
movl%esp, %ebp
subl$24, %esp
andl$-16, %esp
movl$0, %eax
addl$15, %eax
addl$15, %eax
shrl$4, %eax
sall$4, %eax
movl%eax, -8(%ebp)
movl-8(%ebp), %eax
call__alloca
call___main
movl$10, -4(%ebp)
movl$11, -4(%ebp)
movl$10, 4(%esp) ;直接用的10
movl$__ZSt4cout, (%esp)
call__ZNSolsEi
movl$0, %eax
leave
ret
.sect
[解决办法]
应该是编译器进行的优化,输出的时候直接赋为10

读书人网 >C++

热点推荐