請教
K&R 《C程式設計語言》 中文版第2版,第36頁第3段:
“優于函式呼叫的引數是運算式,所以在把引數傳遞給函式時也可能進行型別轉換。在沒有函式原型的情況下,char和short都將轉換為int型別”
第7段
”在通常情況下,引數是通過函式原型申明的“
請教下,啥是”函式原型“?
我們傳引數給函式時,資料型別是否轉換也分是否有”函式原型“嗎?也就是”有函式原型“和”沒有函式原型“
uj5u.com熱心網友回復:
函式原型可以理解為函式定義,函式定義時會定義引數的型別,char 和short轉int,是因為int的范圍比char short的范圍大,有時候會自動轉換;沒有函式原型,那就是沒有定義了。
uj5u.com熱心網友回復:
倒是沒聽說過“沒有函式原型”的描述,沒這個詞吧。uj5u.com熱心網友回復:
在C語言標準化之前,函式的宣告是這樣的,即使它實際上帶有引數:# include <stdio.h>
float f (); //K&R 的傳統函式宣告
int main ()
{
printf ("%.2f\n", f (2, 3)); //2和3按照它們本來的型別int傳入,而不是轉換為float傳入,所以計算結果是錯誤的。
return 0;
}
float f (a, b)
float a, b;
{
return a * b;
}
顯然,因為傳統的函式宣告里沒有引數宣告,函式呼叫時不知道引數如何傳進去。只能按照默認,char和short轉換為int,float轉換為double。
標準化的C語言引入了函式原型,即,要求函式的宣告中必須有引數型別的說明:
# include <stdio.h>
float f (float, float); //標準化之后的原型宣告,帶有引數型別。
int main ()
{
printf ("%.2f\n", f (2, 3)); //2和3從int轉換為float之后傳入,所以計算結果是正確的。
return 0;
}
float f (float a, float b) //標準化之后的函式定義
{
return a * b;
}
因為函式有原型宣告,所以在呼叫時,編譯器可以知道傳入的引數應該如何轉換。
uj5u.com熱心網友回復:
If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions.轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247770.html
標籤:C語言
上一篇:c++,求解答
