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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM