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

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

 

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。

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值