c语言中i++和++i的区别

自行打印printf("%d %d",i++,--i);这一行代码,会发现编译器给出的值和我们所想象中是不一样的,我将从汇编的角度对前置++与后置++做一个简单的解释。

普遍化的解释:
后置加加:先取值,然后再加加
前置加加:先加加,再取值

具体分析如下:下图为上面printf语句的汇编代码:
这里写图片描述
最开始执行了下面这几句代码:
这里写图片描述
这三句汇编中执行了–操作,说明,printf函数中,两个i,先计算–i,然后计算i++.
这三句话做了一下的事情:
1.将i从内存中取出来,然后存入到寄存器中。
2.将寄存器中的值-1。
3.将寄存器中减过1得值存入到内存地址中去。
总结:前置减减,是对值做了减操作后,将其存入到原来的位置。
下面的代码实现了i++:
这里写图片描述
上面代码完成了下面几件事情:
1.将值从内存中取出来放入到寄存器中。
2.将内存器的值放入到临时变量中去。
3.将值从内存中再次取出来,放入到另一个寄存器中去。
4.给第二个寄存器加一。
5.将加一后的寄存器中的值放回到原地址中去。
总结:后置加加将值先放入到临时变量中,然后再做前置加加的事情。
然后,编译器将针对printf这个函数,进行一个压栈的操作。请注意压栈的顺序:
这里写图片描述
这里四句代码做了下面几件事:
1.首先从内存上取i的值,放入到寄存器中,将寄存器中压栈。
2.将刚才生成的临时变量的值,放入到另一个寄存器中,将该寄存器压栈。
函数参数的入栈过程一直保持着从右向左入栈的顺序。刚才已经分析,后置加加操作,将i先取出放入临时变量中,此刻后入临时变量的值,那么说明入栈过程一直保持着从右向左入栈的顺序。
注意:前置减减操作完成后,入栈的i值是直接从内存中取值,凡是遇到前置加加或减减操作,其取值都是从内存中直接取值,此刻内存中的值,是对i全部计算完成之后的值。
按照上面的分析过程,可以分析printf(”%d %d %d %d\n”,i++,i–,–i,++i);

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值