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);
使用這替代上面的宣告後,我們重新編譯程式,會發現第一種情況,也就是缺少引數的會提示錯誤資訊:傳遞引數過少。修改過後,再編譯,就能通過。
這裡我們在使用imax(3.0,5.0)的時候,編譯沒有錯誤提示,但是會有警告,提示double型別被轉成int型別,這可能導致損失資料。the maximum of
3 adn 5
is5.
the maximum of
3and5is
5.
無參:int imax(void);如
imax(3.9,5.4);
等價於imax(3,5);
不確定引數: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語言中函式是必不可少的,所以傳參問題必須要懂,實際運用的時候也會很方便 函式的形參在函式被呼叫的時候才會被分配位址空間的,而且使用後會被收回的。這個是很簡單的,就是平常最常見的,呼叫函式時,形參被分配空間,同時將實參的數值賦值乙份給形參空間 如果是表示式的話,就計算後再給形參 然後形參的生死改變就...