函式呼叫的入棧順序

2021-06-22 06:35:51 字數 423 閱讀 9530

今天看書時看到如下的程式:

#include int main()

執行之後發現結果為 4, 3,發現printf函式的運算順序是從右向左的。查閱了一下,簡單的解釋如下:

函式呼叫時,函式引數的值要先入棧,入棧的順序為從右到左,因此先將a++表示式的值(等於3)入棧,再將a的值(此時為4)入棧,因此輸出的結果為4,3。

函式呼叫的入棧順序由編譯器決定,測試vs2010和gcc4.8中為從右到左,有網友說vc++6.0為從左到右,如此的話此程式在vc++6.0的結果應為3,3。

因此,不單是printf函式,其他函式呼叫時也應注意入棧的順序。

採用從右到左的入棧順序的原因是為了支援可變引數,更詳細的解釋應參見「堆疊幀」(stack frame)的解釋了,如《c和指標》的18.1.5中有說明。 

合法入棧順序

題目描述 我們知道,乙個入棧序列是的合法出棧序列有,等,而是不合法的.現在冰語有乙個長度為n的序列a 保證序列內數字唯一,且1 a i n 他想知道這個序列是不是入棧順序的合法出棧序列,你能告訴他麼?輸入 第一行為t,表示樣例個數 每個樣例第一行為n,第二行為n個數 1 t 1e4,3 n 100 ...

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...

語言中函式引數的入棧順序

對技術執著的人,比如說我,往往對一些問題,不僅想做到 知其然 還想做到 知其所以然 語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,語言中函式引數的入棧順序如何?從右至左,我隨口回答。為什麼是從右至左呢?我終究沒有給出合理的解釋。於是,只好做了個作業,於...