一個表達式運算順序的問題

在一個羣裏遇到一哥們問表達式運算順序:

 

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。

 

過程還挺複雜的,不看彙編代碼,真不好理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章