函式宣告與形參問題

2021-08-01 03:56:06 字數 1304 閱讀 8304

ansi c是美國國家標準協會(ansi)對c語言發布的標準。使用c的軟體開發者被鼓勵遵循ansi c文件的要求,因為它鼓勵使用跨平台的**。

在ansi c規範之前,我們在宣告函式的時候只要宣告其返回型別,這樣就可能有如下問題產生:

#include

int imax(); //舊式函式宣告,沒有引數

int main()

int imax(n,m)

可能輸出如下:

the maximum of

3 adn 5

is4273984.

the maximum of

3and5is

1074266112.

由於作業系統的內部機制不同,上面的錯誤結果可能也不同。

第乙個執行過程如下:

呼叫函式首先把引數放入堆疊臨時儲存

被呼叫函式從堆疊中讀取這些引數

被呼叫函式是根據其形參的型別進行資料讀取的。因此,函式呼叫imax(3)把乙個整數放到堆疊中

當函式imax()執行時,會從堆疊中讀取兩個整數,但實際只有乙個正確的整數在堆疊中,所以第二個資料是當時恰好在堆疊中的其它數這裡是4273984

第二個執行過程如下:

呼叫函式時,傳遞的是float型別,這會將兩個double型別的數值存放在堆疊中(float作為引數傳遞時會被轉成double型別)。這意味著兩個64位數值,也就是128位的資料被儲存在堆疊中。

因為int是32位,那麼imax()會從堆疊中讀取兩個int型別資料

對於此的解決方案是在宣告函式的同時為其指定引數型別。

我們可以使用如下宣告: 

int imax(int a,int b); 

int imax(int,int);

使用這替代上面的宣告後,我們重新編譯程式,會發現第一種情況,也就是缺少引數的會提示錯誤資訊:傳遞引數過少。修改過後,再編譯,就能通過。

the maximum of

3 adn 5

is5.

the maximum of

3and5is

5.

這裡我們在使用imax(3.0,5.0)的時候,編譯沒有錯誤提示,但是會有警告,提示double型別被轉成int型別,這可能導致損失資料。

imax(3.9,5.4);

等價於imax(3,5);

無參:int imax(void); 

不確定引數:int imax(int b,…);

原始碼位置:

c 函式宣告 與 定義 形參區別

ofstream operator ofstream const gra adjmul 宣告 ofstream operator ofstream s const gra adjmul g 定義 變數必須先宣告後使用,函式也必須在呼叫前先宣告。與變數的定義類似,函式的宣告也可以與定義分離。乙個函式只...

C語言 函式的宣告 形參和實參

例1 include voidg void int main 例2 include voidf void 函式宣告,分號不能丟 intmain voidf void 函式呼叫和函式定義的順序 如果函式呼叫寫在函式定義前面,則必須加函式前置宣告 告訴編譯器即將可能出現的若干個字母代表的是乙個函式 告訴...

C語言函式傳參問題(實參形參問題)

c語言中函式是必不可少的,所以傳參問題必須要懂,實際運用的時候也會很方便 函式的形參在函式被呼叫的時候才會被分配位址空間的,而且使用後會被收回的。這個是很簡單的,就是平常最常見的,呼叫函式時,形參被分配空間,同時將實參的數值賦值乙份給形參空間 如果是表示式的話,就計算後再給形參 然後形參的生死改變就...