2013-12-08 65 views
1

This documentation給出瞭如何編寫可變參數函數printf()的示例。printf()如何真正執行?

作爲文檔,printf()將在字符串中找到第一個%,並使用va_arg(argp, int)獲取第一個參數指針;找到字符串中的第二%和再次使用va_arg(argp, int)獲得第二個參數指針......

所以,我寫的代碼片段:

int Var = 0; 

int Func (int X) 
{ 
    Var = Var + X; 
    return Var; 
} 

int main (void) 
{ 
    printf ("%d\n%d", Func (3), Func (5)); 
} 

它會打印:

8 <-- 5+3 
5 <-- 5 

我知道調用多種功能於printf()是不確定的行爲,但爲什麼不打印:

3 <-- 3 
8 <-- 3+5 

就像樣本代碼documentation

ps:如果我的問題不清楚,請幫我編輯它。謝謝

回答

2

功能參數在C中評估的順序是平臺相關的(未定義,只是未指定)。

看到這個博客,談論它:

如果要強制命令,你會在printf()之前調用Func()

int a = Func(3); 
int b = Func(5); 
printf("%d\n%d", a, b); 
1

雖然這是真的,參數計算順序是不定義,參數放置是。所謂的C調用約定指出參數從右向左推入堆棧。這個順序需要精確地支持可變參數功能。通常,當每個參數被評估時,它會立即被推入堆棧(儘管爲了優化內存寫入而進行的一些模糊優化可能會改變這種情況),所以我們可以預期參數評估的工作原理是從右向左評估它們。

這將意味着Func(5)首先計算,推5入堆棧,然後Func(3)被評估,推8到堆棧中。由printf打印的參數順序爲85