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
posted @ 2018-10-29 19:05  spring-go  阅读(1816)  评论(0编辑  收藏  举报