我尝试搜索旧问题,但我没有解决我的问题。
我试图解释我的疑问;假设工作在c89模式下,如果函数调用前没有函数原型(prototype),则有函数隐式声明,函数类型为int
,参数通过Default转换参数提升:
the objects of type char or short int (whether signed or not) are promoted to either int or unsigned int, as appropriate; and that objects of type float are promoted to type 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
赋值
并尝试打印那些( program a , program b )。
我是一名优秀的程序员,十分优秀!