inplicit函数声明中的默认参数提升
我试着寻找老问题,但我没有解决我的问题 我试图解释我的怀疑; 假设在c89模式下工作,如果在函数调用之前没有函数原型,则函数有一个隐式声明,函数类型为inplicit函数声明中的默认参数提升,c,function,declaration,c89,C,Function,Declaration,C89,我试着寻找老问题,但我没有解决我的问题 我试图解释我的怀疑; 假设在c89模式下工作,如果在函数调用之前没有函数原型,则函数有一个隐式声明,函数类型为int,参数通过默认参数升级转换: char或short int类型的对象(无论是否有符号)是 升级为int或unsigned int(视情况而定);那 float类型的对象将升级为double类型 因此,如果我编写这样的代码,我同意它必须工作: int main(void){ char a; short b,c; f(a,
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;
}
但我不明白为什么下面两个案例有效
/*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
赋值,然后尝试打印这些(,)。在这两种情况下,都没有规则。两个程序都表现出未定义的行为
具体而言,在程序b中,DAP不适用,因为传递给f
的值属于long
类型。仅提升char
、short
和float
若要查看可能发生的情况,请在
main
中为a
、b
和c
赋值,然后尝试打印这些(,)。谢谢,我的疑问是因为如果我调用f传递一个浮点,它将被提升为双精度,并且f的参数类型为float,我编译代码时出错,但是在这两种情况下,我没有错误。你确定这些程序有未定义的行为吗?上次我读标准的时候,它说了一些听起来像是,如果你用long
参数(比如x
)调用一个函数intf(inta)
,这将像赋值inta=x一样发生代码>。赋值将把long
类型隐式转换为int
。或者我错了?啊,对不起,我明白了,这是关于隐式声明的-如果它隐式声明为intf(long a)
,但(外部)定义为intf(inta)
,是的,这将是未定义的。但奇怪的是,两个程序编译时都没有错误(至少在gcc上)。如果编译器看到隐式声明(确实如此)和后面的定义,它应该(甚至必须?)抛出一个错误,因为参数类型不匹配。谢谢,我的疑问是因为如果我调用f传递一个浮点,它被提升为双精度,而f有一个浮点类型的参数,我编译代码时出错,但是在这两种情况下,我没有错误。你确定这些程序有未定义的行为吗?上次我读标准的时候,它说了一些听起来像是,如果你用long
参数(比如x
)调用一个函数intf(inta)
,这将像赋值inta=x一样发生代码>。赋值将把long
类型隐式转换为int
。或者我错了?啊,对不起,我明白了,这是关于隐式声明的-如果它隐式声明为intf(long a)
,但(外部)定义为intf(inta)
,是的,这将是未定义的。但奇怪的是,两个程序编译时都没有错误(至少在gcc上)。如果编译器看到隐式声明(确实如此)和后面的定义,它应该(甚至必须?)抛出一个错误,因为参数类型不匹配。