我试图搜索旧问题,但我没有解决我的问题。
我试图解释我的怀疑;
假设在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没有执行时,参数的类型与参数的类型不同,在隐式函数声明的情况下应用了什么规则?
答案 0 :(得分:3)
在这两种情况下,都没有规则。两个程序都表现出不确定的行为。
具体而言,在程序b中,DAP不适用,因为传递给f
的值属于long
类型。仅提升char
,short
和float
。
要查看可能的内容,请在a
中为b
,c
和main
提供值并尝试打印({{3} },program a)。