首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个关于const的有关问题,同几个地址,加不加const居然不一样?

2012-04-06 
一个关于const的问题,同几个地址,加不加const居然不一样?!!在DEV-CPP上运行如下代码,感到结果非常不可思议

一个关于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

热点排行