在一個羣裏遇到一哥們問表達式運算順序:
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。
過程還挺複雜的,不看彙編代碼,真不好理解。