|
发表于 2012-5-25 22:13:12
|
显示全部楼层
#include<stdio.h>
void main()
{
int i=0;
int j=0;
printf("i=%d\n",i++);
printf("i=%d\n", i++);
printf("j=%d,j=%d\n",j++,j++);
}
执行结果:
i=0
i=1
j=0,j=0
分析:看反编译的汇编文件就能知道,两个j++,在反编译后用的不是同一个寄存器,而是ecx,edx,因此结果为0也不难理解了。
6: printf("i=%d\n",i++);
00401036 mov eax,dword ptr [ebp-4]
00401039 mov dword ptr [ebp-0Ch],eax
0040103C mov ecx,dword ptr [ebp-0Ch]
0040103F push ecx
00401040 push offset string "i=%d\n" (0042202c)
00401045 mov edx,dword ptr [ebp-4]
00401048 add edx,1
0040104B mov dword ptr [ebp-4],edx
0040104E call printf (004010f0)
00401053 add esp,8
7: printf("i=%d\n", i++);
00401056 mov eax,dword ptr [ebp-4]
00401059 mov dword ptr [ebp-10h],eax
0040105C mov ecx,dword ptr [ebp-10h]
0040105F push ecx
00401060 push offset string "i=%d\n" (0042202c)
00401065 mov edx,dword ptr [ebp-4]
00401068 add edx,1
0040106B mov dword ptr [ebp-4],edx
0040106E call printf (004010f0)
00401073 add esp,8
9: printf("j=%d,j=%d\n",j++,j++);
00401076 mov eax,dword ptr [ebp-8]
00401079 mov dword ptr [ebp-14h],eax
0040107C mov ecx,dword ptr [ebp-14h]
0040107F push ecx
00401080 mov edx,dword ptr [ebp-8]
00401083 mov dword ptr [ebp-18h],edx
00401086 mov eax,dword ptr [ebp-18h]
00401089 push eax
0040108A push offset string "j=%d,j=%d\n" (0042201c)
0040108F mov ecx,dword ptr [ebp-8]
00401092 add ecx,1
00401095 mov dword ptr [ebp-8],ecx
00401098 mov edx,dword ptr [ebp-8]
0040109B add edx,1
0040109E mov dword ptr [ebp-8],edx
004010A1 call printf (004010f0)
004010A6 add esp,0Ch |
|