我试图搜索旧问题,但我没有解决我的问题。
我试图解释我的怀疑;假设工作在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 时,参数的类型与参数的类型不同,在隐式函数声明的情况下应用什么规则?