第2个回答 2008-06-02
00401612 mov edx,dword ptr [a]
00401615 mov eax,dword ptr [a]
00401618 add eax,1
0040161B mov dword ptr [a],eax
0040161E test edx,edx
00401620 jg main+0F1h (00401651)
00401622 mov ecx,dword ptr [b]
00401625 mov edx,dword ptr [b]
00401628 sub edx,1
0040162B mov dword ptr [b],edx
0040162E test ecx,ecx
00401630 jne main+0DBh (0040163b)
00401632 mov dword ptr [ebp-24h],1
00401639 jmp main+0E2h (00401642)
0040163B mov dword ptr [ebp-24h],0
00401642 cmp dword ptr [ebp-24h],0
00401646 jg main+0F1h (00401651)
00401648 mov dword ptr [ebp-28h],1
0040164F jmp main+0F8h (00401658)
00401651 mov dword ptr [ebp-28h],0
00401658 mov eax,dword ptr [ebp-28h]
0040165B mov dword ptr [k],eax
上面是k=(a++<=0)&&(!b--<=0) 的汇编代码,不同的编译器可能会有不同的结果。
前4行是对a进行了加1操作,7到10行是对b进行了减1操作;此时a=0,b=3,!b=0,所以k=1
2、C语言里对逻辑运算进行了优化,对于&&来说,如果第一个操作数为假,就没有必要再运算了