Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
inplicit函数声明中的默认参数提升_C_Function_Declaration_C89 - Fatal编程技术网

inplicit函数声明中的默认参数提升

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,

我试着寻找老问题,但我没有解决我的问题

我试图解释我的怀疑; 假设在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;
}
但我不明白为什么下面两个案例有效

/*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上)。如果编译器看到隐式声明(确实如此)和后面的定义,它应该(甚至必须?)抛出一个错误,因为参数类型不匹配。