在隐式函数声明的情况下的默认参数提升
我试图搜索旧问题,但我没有解决我的问题。
我试着解释我的怀疑; 假设在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
类型。 只促进char
, short
和float
。
要查看可能发生的情况,请在main
为a
, b
和c
,然后尝试打印( 程序a , 程序b )。