2012-04-27 84 views
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未執行時,參數的類型不是相同類型的參數,在隱式函數聲明的情況下應用了什麼規則?

回答

3

在這兩種情況下,都沒有規定。兩個程序都顯示未定義的行爲。

具體而言,在程序b中,DAP不適用,因爲傳遞給f的值的類型爲long。只有char,0 shortfloat被提升。

要查看威力發生,給值abcmain並嘗試打印這些(program aprogram b)。

+0

謝謝我的疑問來了,因爲如果我調用f傳遞一個浮點數,即提升爲double,並且f有float類型的參數我有一個編譯錯誤的代碼,但在這兩種情況下我沒有錯誤 – newbie 2012-04-27 20:24:03

+0

你確定這些程序有未定義的行爲?上次我讀標準時,它說了一些我聽起來喜歡的東西,如果你用'long'參數(比如''x'')調用一個函數'int f(int a)',這會發生,就好像一個assignes 'int a = x;'。並且assignement會隱式地將'long'類型轉換爲'int'。或者我錯了? – Anthales 2012-04-27 20:29:27

+0

啊,對不起,我明白了,它是關於隱式聲明的 - 如果它被隱式聲明爲「int f(long a)',但(外部)定義了'int f(int a)',是的,這將是未定義的。 – Anthales 2012-04-27 20:43:39