0

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

我试图解释我的怀疑;假设工作在c89模式下,如果在函数调用之前没有函数的原型,则有函数的隐式声明,函数的类型是int,参数通过Default Argument Promotions进行转换:

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;
}

但我不明白为什么以下两种情况有效

/*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 被提升为两倍,然后呢?

在 b) 的情况下:这里没有 DAP 会发生什么?

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

4

1 回答 1

3

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

具体来说,在程序 b 中,DAP 不适用,因为传递给的值f是 type long。只有char,shortfloat被提升。

要查看可能a发生的情况,请为bcin赋予值main并尝试打印它们(程序 a程序 b)。

于 2012-04-27T20:13:52.407 回答