最近看到一些程序員的筆試題目,經常會考到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