`
leidiqiu
  • 浏览: 133108 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个表达式运算顺序的问题

J# 
阅读更多

在一个群里遇到一哥们问表达式运算顺序:

 

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。

 

过程还挺复杂的,不看汇编代码,真不好理解。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics