C C 語言基礎知識 函式呼叫規則

2021-10-14 18:15:06 字數 1614 閱讀 6199

#include void main()  

* 求執行結果

在64位ubuntu上的輸出結果是 :2 2 4 2 5 2

在嵌入式平台ssc323上輸出結果是 :2 2 4 2 3 2

引數壓棧順序

棧維護返回值存放

函式名稱修飾

呼叫規則

__cdecl

__stdcall

__fastcall

__pascal

__thiscall

引數壓棧順序

從右到左

從右到左

用ecx和edx傳送前兩個雙字(dword)或更小的引數,剩下的引數仍舊自右向左壓棧傳送

從左到右

從右到左

棧維護函式呼叫者

函式本身

函式本身

函式本身

函式本身

返回值存放

eaxeax

eaxeax

eaxc編譯器名稱修飾

函式名前加上乙個下劃線字首

函式名前加上乙個下劃線字首

函式名前加上乙個"@「符號,後面也是乙個」@"符號和其引數的位元組數

c++編譯器名稱修飾

規則與_stdcall呼叫約定相同,只是參數列的開始標識由上面的"@@yg"變為"@@ya"。

見表下面

規則與_stdcall呼叫約定相同,只是參數列的開始標識由上面的"@@yg"變為"@@yi"

void fatal () __attribute__ ((stdcall__));

* 在標頭檔案中可以

void fatal () __attribute__ ((__stdcall__));

函式呼叫引數壓棧前,先會對所有引數進行運算,運算順序:64位ubuntu上是從右往左,ssc323平台是從左往右,可能是由壓棧順序決定的。

對於i–,會生成臨時變數儲存運算的結果,壓棧也是使用的生成的臨時變數。

對於–i,不會生成臨時變數,經過了所有的引數運算後,最後壓棧時使用的是變數i。

1. i, //所有引數運算完後,i值為2

2. i--, //從右往左運算,生成的臨時變數值為5

3. i, //所有引數運算完後,i值為2

4. i--, //從右往左運算,生成的臨時變數值為4

5. --i, //所有引數運算完後,i值為2

6. i //所有引數運算完後,i值為2

* 所以輸出結果為:2 2 4 2 5 2

* 結果的顯示順序還是從左到右,按**需求來的,不會由於底層實現不同而發生變化。

1. i, //所有引數運算完後,i值為2

2. --i, //所有引數運算完後,i值為2

3. i--, //從左往右運算,生成的臨時變數值為4

4. i, //所有引數運算完後,i值為2

5. i--, //從左往右運算,生成的臨時變數值為3

6. i //所有引數運算完後,i值為2

* 所以輸出結果為:2 2 4 2 3 2

* 結果的顯示順序還是從左到右,按**需求來的,不會由於底層實現不同而發生變化。

C C 基礎知識總結 函式

1.隨機函式的使用 1.1 標頭檔案 include 或 include 1.2 用法 srand int seed 偽隨機,傳隨機種子 int d 1 rand 6 生成1 6隨機數 2.函式的引數傳遞 2.1 函式未被呼叫時,函式的形參不占有記憶體空間,也沒有實際的值。只有在函式被呼叫時才為形參...

C C 基礎知識

c 基礎知識 定義在class宣告內的成員函式預設是inline函式 進製 問 假設在n進製下,等式 240 12 2880 成立,n值是 a 19 b 18 c 17 d 16 e 15 f 以上都對 答 2 n 2 4 n 1 1 n 2 2 n 3 8 n 2 8 n 1 化簡後為恒等式,故n...

C C 基礎知識

乙個指標可以被多次賦值,但是引用只可以在建立的時候就必須初始化,初始化完畢後就不可改變 乙個指標有它自己的記憶體位址和棧上的大小 x86上面為4byte 但是引用與原有變數共享相同的記憶體位址,但是在棧上仍然占用一些記憶體空間。指標可以指向null,但是引用必須引用乙個有效的物件 乙個指標需要使用 ...