int i=3; printf("%d,%d,%d",i,i++,i++);结果是3,3,3,而int i=3; printf("%d,%d,%d",i+8,i+=5,i--);

http://zhidao.baidu.com/link?url=Vy-yASb2cE4LihdVaEpUqHkk-vMLZC141arTg4b61CHVL5dhqQKE81SyYcfJTvA15nsHRJsj40QlEEshHvjpIK 


像这种计算循序的问题答案不是确定的,不同的编译器规定的计算循序是不一样的。你这个结果估计是在vc6.0上计算出来的,我用的是VS2012,得到的结果就和你的不一样。我得到的结果是5,4,3和17,9,5.有图有证据,图如下:


这样的题目很多,我教你一种分析的方法,以后碰到这样的题目就不怕了。

  1. 按F10进入调试状态;

  2. 在写代码的区域右键,选择转到反汇编;

  3. 看汇编是怎么写的一目了然。下面我把vs2012上反汇编出来的代码贴出来给你讲解一下。


#include <stdio.h>
int main()
{
 push        ebp  
 mov         ebp,esp  
 sub         esp,0D4h  
 push        ebx  
 push        esi  
 push        edi  
 lea         edi,[ebp-0D4h]  
 mov         ecx,35h  
 mov         eax,0CCCCCCCCh  
 rep stos    dword ptr es:[edi]  
 int i = 3;
 mov         dword ptr [i],3  //mov是移动指令,把3移到i中
 printf("%d,%d,%d", i, i++, i++);
 mov         eax,dword ptr [i]  //把i(也就是3)移到eax寄存器中
 mov         dword ptr [ebp-0D0h],eax  //把eax(即3)移到ebp-0D0h这个相对地址中
 mov         ecx,dword ptr [i]  //把i(也就是3)移到ecx寄存器中
 add         ecx,1  //add是加指令,把ecx中的数值加1,即为4
 mov         dword ptr [i],ecx  //把ecx(其值为4)移到i中
 mov         edx,dword ptr [i]  //把i(也就是4)移到edx寄存器中
 mov         dword ptr [ebp-0D4h],edx  //把edx(即4)移到ebp-0D4h这个相对地址中
 mov         eax,dword ptr [i]  //把i(也就是4)移到eax寄存器中
 add         eax,1  //把eax中的数值加1,即eax中的值为5
 mov         dword ptr [i],eax  //把eax(即5)移到i中
 mov         esi,esp  
 mov         ecx,dword ptr [ebp-0D0h]  //移动ebp-0D0h地址中的值,即3到ecx
 push        ecx  //3压栈
 mov         edx,dword ptr [ebp-0D4h]  //移动ebp-0D4h地址中的值,即4到edx
 push        edx  //4压栈
 mov         eax,dword ptr [i] //5移到eax中
 push        eax  //5压栈
 push        10C5858h  
 call        dword ptr ds:[10C92BCh]  
 add         esp,10h  
 cmp         esi,esp  
 call        __RTC_CheckEsp (010C113Bh)  
 printf("\n");
 mov         esi,esp  
 push        10C5FD8h  
 call        dword ptr ds:[10C92BCh]  
 add         esp,4  
 cmp         esi,esp  
 call        __RTC_CheckEsp (010C113Bh)  
 printf("%d,%d,%d", i + 8, i += 5, i--);
 mov         eax,dword ptr [i]  
 mov         dword ptr [ebp-0D0h],eax  
 mov         ecx,dword ptr [i]  
 printf("%d,%d,%d", i + 8, i += 5, i--);
 sub         ecx,1  
 mov         dword ptr [i],ecx  
 mov         edx,dword ptr [i]  
 add         edx,5  
 mov         dword ptr [i],edx  
 mov         esi,esp  
 mov         eax,dword ptr [ebp-0D0h]  
 push        eax  
 mov         ecx,dword ptr [i]  
 push        ecx  
 mov         edx,dword ptr [i]  
 add         edx,8  
 push        edx  
 push        10C5858h  
 call        dword ptr ds:[10C92BCh]  
 add         esp,10h  
 cmp         esi,esp  
 call        __RTC_CheckEsp (010C113Bh)  
 printf("\n");
 mov         esi,esp  
 printf("\n");
 push        10C5FD8h  
 call        dword ptr ds:[10C92BCh]  
 add         esp,4  
 cmp         esi,esp  
 call        __RTC_CheckEsp (010C113Bh) 
 return 0;
 xor         eax,eax  
}

我只分析了一部分,经过压栈操作,最后出来的数就是5,4,3了。第一个也类似分析。

会看汇编就容易多了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值