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

const的应用

2012-10-12 
const的运用const int i10int & ir(int&)iir5printf(%d %d %d %d\n,ir,i,&ir,&i)输出之后发现ir

const的运用
const int i=10;
int & ir=(int&)i;
ir=5;
printf("%d %d %d %d\n",ir,i,&ir,&i);
输出之后发现ir和i的地址是一样的,但ir输出5,i输出10,这是为什么

[解决办法]
编译器提前将所有的i替换成了10,所以i被修改之后没有被输出出来,其实i已经被改为5了。

C/C++ code
const int i=10;002B13BE  mov         dword ptr [i],0Ah          //i的值    int & ir=(int&)i;002B13C5  lea         eax,[i]  002B13C8  mov         dword ptr [ir],eax      ir=5;002B13CB  mov         eax,dword ptr [ir]  002B13CE  mov         dword ptr [eax],5      printf("%d %d %d %d\n",ir,i,&ir,&i);002B13D4  mov         esi,esp  002B13D6  lea         eax,[i]  002B13D9  push        eax  002B13DA  mov         ecx,dword ptr [ir]    //输出了ir002B13DD  push        ecx  002B13DE  push        0Ah                   //这里没有输出i中修改过的值,因为编译器给优化了002B13E0  mov         edx,dword ptr [ir]  002B13E3  mov         eax,dword ptr [edx]  002B13E5  push        eax  002B13E6  push        offset string "%d %d\n" (2B7930h)  002B13EB  call        dword ptr [__imp__printf (2BA2B8h)]  002B13F1  add         esp,14h  002B13F4  cmp         esi,esp  002B13F6  call        @ILT+300(__RTC_CheckEsp) (2B1131h)      return 0;
[解决办法]
C/C++ code
const int i=10;int & ir=(int&)i; ir=5;printf("%d %d %d %d\n",ir,i,&ir,&i);输出之后发现ir和i的地址是一样的,但ir输出5,i输出10,这是为什么//ir是对i的一个引用,即10;//由于ir是个变量,并没有用const修饰,当然可以改变它的值了,所以在执行完ir=5;//ir的值是5。
[解决办法]
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

热点排行
Bad Request.