i++与++i的区别

再解析i++与++i的区别前我们先看两道题:

 

#define SQUARE(a)((a)*(a))
    int a=5;

    int b=SQUARE(a++);

    int c=5;
    int d=SQUARE(++c);  

答案是a=7,b=25,c=7,d=49,

其实从这个答案上我们就可以看出些眉目了,当a++作为参数的时候,其实先以a的原值(未加1之前的值)作为操作数进行运算,运算结束后再执行a的自加操作,当c++作为参数的时候,其实先执行c的自加操作,运算结束后再以c改变后的值(加1之后的值)作为操作数进行运算

在vc中看汇编代码就可以证实这一点

 

 

259:      int a=5;
00401F9D   mov         dword ptr [ebp-8],5
260:
261:      int b=SQUARE(a++);
00401FA4   mov         eax,dword ptr [ebp-8]
00401FA7   imul        eax,dword ptr [ebp-8] //先执行imul
00401FAB   mov         dword ptr [ebp-0Ch],eax
00401FAE   mov         ecx,dword ptr [ebp-8]
00401FB1   add         ecx,1  //自加
00401FB4   mov         dword ptr [ebp-8],ecx
00401FB7   mov         edx,dword ptr [ebp-8]
00401FBA   add         edx,1//自加
00401FBD   mov         dword ptr [ebp-8],edx
262:
263:      int c=5;
00401FC0   mov         dword ptr [ebp-10h],5
264:      int d=SQUARE(++c);
00401FC7   mov         eax,dword ptr [ebp-10h]
00401FCA   add         eax,1//自加
00401FCD   mov         dword ptr [ebp-10h],eax
00401FD0   mov         ecx,dword ptr [ebp-10h]
00401FD3   add         ecx,1//自加
00401FD6   mov         dword ptr [ebp-10h],ecx
00401FD9   mov         edx,dword ptr [ebp-10h]
00401FDC   imul        edx,dword ptr [ebp-10h]/再执行imul
00401FE0   mov         dword ptr [ebp-14h],edx

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值