隐式函数声明的默认参数提升

时间:2012-04-27 19:51:22

标签: c function declaration c89

我试图搜索旧问题,但我没有解决我的问题。

我试图解释我的怀疑; 假设在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): a和b被提升为int,c被提升为double,然后是?

在案例b)中

: 这里没有DAP会发生什么?

所以问题是:在DAP之后或DAP没有执行时,参数的类型与参数的类型不同,在隐式函数声明的情况下应用了什么规则?

1 个答案:

答案 0 :(得分:3)

在这两种情况下,都没有规则。两个程序都表现出不确定的行为。

具体而言,在程序b中,DAP不适用,因为传递给f的值属于long类型。仅提升charshortfloat

要查看可能的内容,请在a中为bcmain提供值并尝试打印({{3} },program a)。