那是因為不定長引數函式的存在。。。。
我們先看看printf
函式
_check_return_opt_ _crtimp int __cdecl _vfprintf_l(_inout_ file * _file,
_in_z_ const
char * _format,
_in_opt_ _locale_t _locale,
va_list _arglist);
沒錯,它是乙個不定參函式,那麼我們在實際使用中是怎麼樣知道它的引數個數呢?這就要靠format了,編譯器通過format中的%佔位符的個數來確定引數的個數。
現在我們假設引數的壓棧順序是從左到右的,這時,函式呼叫的時候,format最先進棧,之後是各個引數進棧,最後pc進棧,此時,由於format先進棧了,上面壓著未知個數的引數,想要知道引數的個數,必須找到format,而要找到format,必須要知道引數的個數,這樣就陷入了乙個無法求解的死迴圈了!!
而如果把引數從右到左壓棧,情況又是怎麼樣的?函式呼叫時,先把若干個引數都壓入棧中,再壓format,最後壓pc,這樣一來,棧頂指標加2便找到了format,通過format中的%佔位符,取得後面引數的個數,從而正確取得所有引數。
如此,世界就正常了。
注意:
函式引數的壓棧順序跟函式引數計算順序不是一回事,函式引數計算順序跟具體的編譯器實現有關。
C語言函式引數壓棧順序為何是從右到左?
上學期學習了組合語言,並在作業系統實驗中使用了彙編 c語言混合程式設計,中間也了解了一些c語言與組合語言的對應關係。由於組合語言是底層的程式語言,各種函式引數都要直接控制棧進行訪問,在混合程式設計中,要用彙編來呼叫c函式,當然就要知道引數的壓棧情況了。當知道c函式的引數壓棧順序是從右到左時,我覺得很...
C語言函式引數入棧的順序為什麼是從右到左
執行以下 void print int x,int y,int z int main 輸出 首先明確乙個事實 在乙個程序的記憶體圖中,棧段位於上部,並且從高位址到低位址擴充套件,不會的可以看這裡 原因 由於c語言有不定長引數函式,比如下面這個 int add int num,清理記憶體 va end...
C C 可變引數函式
可變引數的函式,即函式的引數個數和引數型別不完全確定的函式。這類函式最常見的就是printf scanf函式。在c c 中,為了通知編譯器函式有可變引數,必須以三個點結束該函式的宣告。例如 printf函式的宣告 int printf const char format,scanf函式宣告 int ...