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了。第一个也类似分析。
会看汇编就容易多了。