在一个群里遇到一哥们问表达式运算顺序:
int main(int argc, char* argv[]) { int i = 2; int j ; j = ( i++ ) *( --i )/ (i << 1); return 0; }
结果为:
i=2
j=0
查看汇编代码:
9: int i = 2; 00401028 mov dword ptr [ebp-4],2 10: int j ; 11: j = ( i++ ) *( --i )/ (i << 1); 0040102F mov eax,dword ptr [ebp-4] 00401032 sub eax,1 00401035 mov dword ptr [ebp-4],eax 00401038 mov eax,dword ptr [ebp-4] 0040103B imul eax,dword ptr [ebp-4] 0040103F mov ecx,dword ptr [ebp-4] 00401042 shl ecx,1 00401044 cdq 00401045 idiv eax,ecx 00401047 mov dword ptr [ebp-8],eax 0040104A mov edx,dword ptr [ebp-4] 0040104D add edx,1 00401050 mov dword ptr [ebp-4],edx 12: return 0;
其中:
变量 i 对应 dword ptr [ebp-4]
变量 j 对应 dword ptr [ebp-8]
运算过程为:
--i
0040102F mov eax,dword ptr [ebp-4]
00401032 sub eax,1
00401035 mov dword ptr [ebp-4],eax
*
00401038 mov eax,dword ptr [ebp-4]
0040103B imul eax,dword ptr [ebp-4]
<<
0040103F mov ecx,dword ptr [ebp-4]
00401042 shl ecx,1
00401044 cdq
/
00401045 idiv eax,ecx
=
00401047 mov dword ptr [ebp-8],eax
i++
0040104A mov edx,dword ptr [ebp-4]
0040104D add edx,1
00401050 mov dword ptr [ebp-4],edx
首先 --i,自减,i=1;
然后 *,相乘,1*1=1;
然后 << ,左移,1<<1=2;
然后 /,相除,1/2=0;
然后 =,赋值,j=0;
最后 i++,自加,i=2。
过程还挺复杂的,不看汇编代码,真不好理解。