printf中连续输出i++,--i,++i,i--的值如何

首先看一下代码:

#include <stdio.h>
void main()
{
int i=10;
printf("%d  %d  %d  %d  %d\n",i--,--i,++i,i++,i);
}

开始我的预测答案是:11  11  12  10  10

运行后:11  10  10  10  10


开始我认为是printf的问题就用函数进行了输出,代码如下:

#include <stdio.h>
void fun(int a,int b,int c,int d,int f)
{
printf("%d  %d  %d  %d  %d\n",a,b,c,d,f);
}
void main()
{
int i=10;
fun(i--,--i,++i,i++,i);
}

然而结果还是11  10  10  10  10

所以就对前一段代码进行了反汇编,看一下汇编是如何处理这个的:

运算过程:

00B13C25  mov         eax,dword ptr [i]        从i中取出值放入eax寄存器中
00B13C28  mov         dword ptr [ebp-0D0h],eax           将寄存器的值保存在临时量中


00B13C2E  mov         ecx,dword ptr [i]   取出i的值,加一后写回i
00B13C31  add         ecx,1  
00B13C34  mov         dword ptr [i],ecx  


00B13C37  mov         edx,dword ptr [i]   取出i的值,加一后写回i
00B13C3A  add         edx,1  
00B13C3D  mov         dword ptr [i],edx  


00B13C40  mov         eax,dword ptr [i]   取出i的值,加一后写回i
00B13C43  sub         eax,1  
00B13C46  mov         dword ptr [i],eax  


00B13C49  mov         ecx,dword ptr [i]   取出i的值,保存在临时量中
00B13C4C  mov         dword ptr [ebp-0D4h],ecx  


00B13C52  mov         edx,dword ptr [i]   取出i的值,加一后写回i
00B13C55  sub         edx,1  
00B13C58  mov         dword ptr [i],edx  

输出过程:

00B13C5D  mov         eax,dword ptr [i]   从I中取出值放入寄存器中后入栈
00B13C60  push        eax  
00B13C61  mov         ecx,dword ptr [ebp-0D0h]   从保存后置++的ebp-0D0h中取出值放入寄存器后入栈
00B13C67  push        ecx  
00B13C68  mov         edx,dword ptr [i]   ++i
00B13C6B  push        edx  
00B13C6C  mov         eax,dword ptr [i]    --i
00B13C6F  push        eax  
00B13C70  mov         ecx,dword ptr [ebp-0D4h]    i--
00B13C76  push        ecx  

从上面的汇编可以看出:编译器在处理前置,和后置时是不一样的。

在处理后置时:是将值放入临时量中,在输出时直接从临时量中取值

在处理前置时:是等运算完成后,直接从I的地址中取值

所以才会出现上面那种与我们以前的想法不同的值。

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值