printf函数压栈(i++/i--,++i/--i) 终极解密

1 #include <stdio.h>
2  
3 void main()
4 {
5     int i = 5;
6     printf("%d %d %d %d\n", i, --i, i, i--);
7 }

输出是“3 3 3 5”。-------两条原则解释如下

(1)printf函数的压栈问题,总的来说就是参数从右向左依次压栈(也即i--,i, --i,i),再出栈(i, --i, i, i--)。

(2)对于i++或者i--的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++i或者--i或者i的结果,则直接压寄存器变量,寄存器经过了所有的 自增/减 操作。”因此哪些压入寄存器的变量,我们不妨认为最后的结果i和--i和++i结果相同(他们都可以做左值)

例子2:

1 #include <stdio.h>
2 int  main()
3 {
4     int i = 5;
5     printf("%d %d %d %d %d\n", i, --i, i,++i,i++);      //6 6 6 6 5
6 }

例子3:

 1 x=1;   printf("%d %d\n",x,x++);                      2 1
 2 x=1;   printf("%d %d\n",x++,x);                      1 2
 3 x=1;   printf("%d %d %d\n",x,x++,x);                 2 1 2
 4 x=1;   printf("%d %d %d %d\n",x,++x,x++,x);          3 3 1 3 


借鉴的部分解释请看 http://www.zzzj.com/html/20090609/71613.html 
https://blog.csdn.net/hcx25909/article/details/30219265
https://blog.csdn.net/kzzhr/article/details/8482657?utm_source=blogxgwz8

转载于:https://www.cnblogs.com/chunmu/p/9872560.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值