您的位置:首页 > 其它

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--);

2015-04-02 20:23 537 查看
http://zhidao.baidu.com/link?url=Vy-yASb2cE4LihdVaEpUqHkk-vMLZC141arTg4b61CHVL5dhqQKE81SyYcfJTvA15nsHRJsj40QlEEshHvjpIK

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



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

按F10进入调试状态;

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

看汇编是怎么写的一目了然。下面我把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了。第一个也类似分析。

会看汇编就容易多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐