|
|
发表于 2012-5-21 21:31:54
|
显示全部楼层
4: int x,y,z;
5: x=0,y=0,z=0;
00401028 mov dword ptr [ebp-4],0
0040102F mov dword ptr [ebp-8],0
00401036 mov dword ptr [ebp-0Ch],0
6: ++x||++y&&++z;
0040103D mov eax,dword ptr [ebp-4]
00401040 add eax,1
00401043 mov dword ptr [ebp-4],eax
00401046 cmp dword ptr [ebp-4],0
0040104A jne main+54h (00401064)
0040104C mov ecx,dword ptr [ebp-8]
0040104F add ecx,1
00401052 mov dword ptr [ebp-8],ecx
00401055 cmp dword ptr [ebp-8],0
00401059 je main+54h (00401064)
0040105B mov edx,dword ptr [ebp-0Ch]
0040105E add edx,1
00401061 mov dword ptr [ebp-0Ch],edx
7: printf("%d%d%d\n",x,y,z);
00401064 mov eax,dword ptr [ebp-0Ch]
00401067 push eax
00401068 mov ecx,dword ptr [ebp-8]
0040106B push ecx
0040106C mov edx,dword ptr [ebp-4]
0040106F push edx
00401070 push offset string "%d%d%d\n" (0042201c)
00401075 call printf (004010b0)
0040107A add esp,10h
上面是反汇编的结果,因为自增的优先级高,并且是自左到右的,所以编译器先运行++x,那么此时x的值为1,而C的编译器在运行或运算时,只要有1个值为真,那么后面的都认为为真,并且不运行后面的值,所以导致了++y和++z没没运行就跳转到 printf("%d%d%d\n",x,y,z);了,具体的汇编语言是
00401055 cmp dword ptr [ebp-8],0
00401059 je main+54h (00401064)
这是第一小题的
|
|