gpt4 book ai didi

c - 隐式函数声明情况下的默认参数提升

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:16 24 4
gpt4 key购买 nike

我尝试搜索旧问题,但我没有解决我的问题。

我试图解释我的疑问;假设工作在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 类型。仅提升 charshortfloat

要查看可能会发生什么,请在 main 中为 abc 赋值 并尝试打印那些( program a , program b )。

关于c - 隐式函数声明情况下的默认参数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com