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