那是因為不定長參數函數的存在。。。。
我們先看看PRintf
函數
沒錯,它是一個不定參函數,那么我們在實際使用中是怎么樣知道它的參數個數呢?這就要靠format了,編譯器通過format中的%占位符的個數來確定參數的個數。
現在我們假設參數的壓棧順序是從左到右的,這時,函數調用的時候,format最先進棧,之后是各個參數進棧,最后pc進棧,此時,由于format先進棧了,上面壓著未知個數的參數,想要知道參數的個數,必須找到format,而要找到format,必須要知道參數的個數,這樣就陷入了一個無法求解的死循環了??!
而如果把參數從右到左壓棧,情況又是怎么樣的?函數調用時,先把若干個參數都壓入棧中,再壓format,最后壓pc,這樣一來,棧頂指針加2便找到了format,通過format中的%占位符,取得后面參數的個數,從而正確取得所有參數。
如此,世界就正常了。
注意:
函數參數的壓棧順序跟函數參數計算順序不是一回事,函數參數計算順序跟具體的編譯器實現有關。
新聞熱點
疑難解答
圖片精選