在隐式函数声明的情况下的默认参数提升

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

我试着解释我的怀疑; 假设在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; } 

但我不明白为什么以下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没有执行时,参数的类型不是相同类型的参数,在隐式函数声明的情况下应用什么规则?

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

具体来说,在程序b中,DAP不适用,因为传递给f的值是long类型。 只促进charshortfloat

要查看可能发生的情况,请在mainabc ,然后尝试打印( 程序a , 程序b )。