C語言函式引數呼叫順序

2021-06-01 06:17:11 字數 777 閱讀 2805

浩然君前幾天發過乙個小檔案:關於函式引數的呼叫順序的

int arr = ;

int *ptr = arr;

*(ptr++) += 123;

printf(「 %d %d 」, *ptr, *(++ptr));

輸出:8 8

函式引數入棧的順序,一般vc的編譯器是從右往左入棧,那麼這個運算也自然是從右往左。

++ptr之後ptr再次向後乙個位置移動,即a[2],8。

前面的*ptr自然也就是8,所以這句執行之後輸出的是8,8

又在網上查了下,發現有前輩研究過,就「拿來主義」了,方便自己以後檢視,請前輩海涵

查了一直些文獻得知,引數入棧順序是和具體編譯器實現相關的。比如,pascal語言中引數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual c++.即然兩種方式都可以,為什麼c語言要選擇從右至左呢?

進一步發現,pascal語言不支援可變長引數,而c語言支援這種特色,正是這個原因使得c語言函式引數入棧順序為從右至左。具體原因為:c方式引數入棧順序(從右至左)的好處就是可以動態變化引數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的引數被壓在棧底。除非知道引數個數,否則是無法通過棧指標的相對位移求得最左邊的引數。這樣就變成了左邊引數的個數不確定,正好和動態引數個數的方向相反。

因此,c語言函式引數採用自右向左的入棧順序,主要原因是為了支援可變長引數形式。換句話說,如果不支援這個特色,c語言完全和pascal一樣,採用自左向右的引數入棧方式。

C 構造函式呼叫順序

class y class x public y x one 建構函式的呼叫順序是下面的順序 y 基類的建構函式 x 繼承類的建構函式 對於多基類的情況,下面是乙個例子 class x public y,public z x one 建構函式以宣告的次序呼叫。y 基類建構函式首先被呼叫 z x 虛基...

C 構造函式呼叫順序

1 建立派生類的物件,基類的建構函式函式優先被呼叫 也優先於派生類裡的成員類 2 如果類裡面有成員類,成員類的建構函式優先被呼叫 3 基類建構函式如果有多個基類則建構函式的呼叫順序是某類在類派生表中出現的 順序而不是它們在成員初始化表中的順序 4 成員類物件建構函式如果有多個成員類物件則建構函式的呼...

C語言 支援命名引數的函式呼叫

對於引數較多的函式,如ui庫函式,你很難去記憶每個位置的引數型別和意義,尤其在你的ide比較簡陋的開發環境下,尤為痛苦,可能你需要頻繁的查詢文件。像python這樣語言,原生支援命名引數,如 def func name,age print name,age func aaa 1 func age 2...