printf函數壓棧解惑

        最近看到一些程序員的筆試題目,經常會考到printf函數的參數壓棧問題,總體來講就是參數從右向左依次壓棧,再出棧,但是今天看到一個看似很簡單的題目,卻一直找不到頭緒。題目如下:

#include <stdio.h>

void main()
{
    int i = 5;
    printf("%d %d %d %d\n", i, --i, i, i--);
}


        輸出看似很簡單,但是結果卻打出所料。輸出是“3 3 3 5”。

        似乎僅僅從壓棧順序上很難解釋清楚,google找到了事情的真相:

       “對於a++的結果,是有ebp尋址函數棧空間來記錄中間結果的,在最後給printf壓棧的時候,再從棧中把中間結果取出來;而對於++a的結果,則直接壓寄存器變量,寄存器經過了所有的自增操作。”

       原文請見:http://www.zzzj.com/html/20090609/71613.html 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章