0
我試圖在舊問題中搜索,但我沒有解決我的問題。在隱式函數聲明的情況下的默認參數促銷
我試圖解釋我的疑問; 設在C89模式下工作,如果不是在函數調用前的程序函數的原型,有功能的隱含聲明,函數的類型是int
和參數通過參數默認晉級轉換:
char或short int(無論是否有符號)的對象是 根據需要提升爲int或unsigned int;並且 類型爲float的對象被提升爲double類型。
所以,如果我寫了這樣的代碼,我同意,有工作:
int main(void){
char a;
short b,c;
f(a,b,c);
return 0;
}
int f(int a,int b,int c){
return 1;
}
同樣在這裏:
int main(void){
float a;
short b,c;
f(a,b,c);
return 0;
}
int f(double a,int b,int c){
return 1;
}
但我不明白爲什麼以下2種情況下工作
/*a)*/
int main(void){
short a,b;
float c;
f(a,b,c);
return 0;
}
int f(long a,long b,long c){
return 1;
}
/*b)*/
int main(void){
long a,b,c;
f(a,b,c);
return 0;
}
int f(int a,double b,double c){
return 1;
}
的情況下的): a和b被提升爲int,c加倍然後呢?
在案例b): 這裏沒有DAP會發生什麼?
所以問題是:在DAP或DAP未執行時,參數的類型不是相同類型的參數,在隱式函數聲明的情況下應用了什麼規則?
謝謝我的疑問來了,因爲如果我調用f傳遞一個浮點數,即提升爲double,並且f有float類型的參數我有一個編譯錯誤的代碼,但在這兩種情況下我沒有錯誤 – newbie 2012-04-27 20:24:03
你確定這些程序有未定義的行爲?上次我讀標準時,它說了一些我聽起來喜歡的東西,如果你用'long'參數(比如''x'')調用一個函數'int f(int a)',這會發生,就好像一個assignes 'int a = x;'。並且assignement會隱式地將'long'類型轉換爲'int'。或者我錯了? – Anthales 2012-04-27 20:29:27
啊,對不起,我明白了,它是關於隱式聲明的 - 如果它被隱式聲明爲「int f(long a)',但(外部)定義了'int f(int a)',是的,這將是未定義的。 – Anthales 2012-04-27 20:43:39