printf下的“i++”和“i--”

我们先来看一段程序代码

#include <stdio.h>
void main()
{
    int i = 0;
    printf("%d %d %d", i++, i--, i++);
}
以我们以往的思路分析出来结果应该是0 0 0,但是程序运行出来的结果不是这样的,而是0 1 0。这是为什么呢,我们首先看一下它的汇编代码,看它究竟是如何运行的。
009913E5  mov         eax,dword ptr [i]  
009913E8  mov         dword ptr [ebp-0D0h],eax  
009913EE  mov         ecx,dword ptr [i]  
009913F1  add         ecx,1  
009913F4  mov         dword ptr [i],ecx  
009913F7  mov         edx,dword ptr [i]  
009913FA  mov         dword ptr [ebp-0D4h],edx  
00991400  mov         eax,dword ptr [i]  
00991403  sub         eax,1  
00991406  mov         dword ptr [i],eax  
00991409  mov         ecx,dword ptr [i]  
0099140C  mov         dword ptr [ebp-0D8h],ecx  
00991412  mov         edx,dword ptr [i]  
00991415  add         edx,1  
00991418  mov         dword ptr [i],edx  
0099141B  mov         esi,esp  
0099141D  mov         eax,dword ptr [ebp-0D0h]  
00991423  push        eax  
00991424  mov         ecx,dword ptr [ebp-0D4h]  
0099142A  push        ecx  
0099142B  mov         edx,dword ptr [ebp-0D8h]  
00991431  push        edx
由于编译器是从后往前压参数的,所以我们首先看最后一个“i++”,由汇编代码可以看出编译器编译这一行代码时首先将内存上i的值0赋给寄存器,然后将寄存器的值0赋给临时变量,就成为这种情况:
  寄存器   0
  临时量   0
此时输出寄存器上面的值0。
其次是中间的“i--”,输出0之后对临时变量的值进行i++后临时量的值变为了1,我们将临时量的值1赋给寄存器,此时的情况为:
  寄存器   1
  临时量   1
  此时输出寄存器上面的值1.
 最后是第一个“i++”,输出1之后对临时变量的值进行i-- 后临时变量的值变为了0,将临时变量的值0赋给寄存器,此时的情况:
  寄存器   0
  临时量   0
  此时输出寄存器上的值0。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值