0 c double casting return function
我正在测试代码,但我不明白为什么它会显示“较高的值为0”。这是主要功能:
int main() {
double a,b,c;
a=576;
b=955;
c=higher(a,b);
printf("The higher value is %g\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在另一个.c中,我具有以下功能:
double higher(double a, double b){
if (a>b)
return a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
注意:如果我在main.c中放置了high(),它可以正常工作,但是通过这种方式,它告诉我更高的值是0。
return (int)b;
Run Code Online (Sandbox Code Playgroud)
如果返回双精度值的函数与main()处于相同的.c或位于不同的函数中,会有区别吗?
使用C99或C11编译器进行编译并阅读警告。您正在使用没有原型的函数。
如果没有原型,则C99之前的版本会假定int默认情况下会返回一个函数。C99及更高版本,需要原型。
即使没有启用其他警告:
$ cat test.c
int main()
{
int i = f();
return 0;
}
int f(void)
{
return 1;
}
$ gcc -std=c11 test.c
test.c: In function ‘main’:
test.c:13:2: warning: implicit declaration of function ‘f’ [-Wimplicit-function-declaration]
int i = f();
Run Code Online (Sandbox Code Playgroud)
请注意,gcc在编译时不会发出警告-std=c90,但在启用警告时会发出警告-Wall。
因此,如higher()预期会返回int,则该值将double通过赋值转换为(类型c不变)。
现在,有趣的部分是:由于调用和函数实现的签名不同,未定义的行为(UB,请记住该短语!)。
根据过程调用标准(PCS)和应用程序二进制接口(ABI),可能会发生什么-请查阅Wikipedia。简短地说:本身会传回。这很可能通过浮点CPU寄存器传递给调用方。调用者OTOH希望在整数CPU寄存器(偶然发生保留)中返回值(由于缺少原型)。higherdouble0
因此,由于他们显然存在沟通不畅的情况,因此您将得到错误的结果。请注意,这只是一个推测,取决于PCS / ABI。唯一要记住的是这是UB,所以任何事情都可能发生,甚至是恶魔从你的鼻子里飞出来。
为什么使用原型:
好了,您已经注意到,如果您正确调用函数,编译器不知道。更糟糕的是,它不知道使用了哪种参数类型以及返回了哪种结果类型。这特别是一个问题,因为C会自动转换某些类型(您在这里确实遇到过)。
作为经典K&R(预标准)C没有原型,假定所有参数未知功能int/ double用于在呼叫标量参数。结果默认为int。(很久以前,我可能会丢失一些部分;我开始使用K&R进行一些编码,弄乱了类型(这正是您的问题,但没有一个干净的解决方案),等等,将其扔到一个角落,并在Modula-2中愉快地进行了编程直到几年后,我尝试使用ANSI-C)。
如果现在正在编译代码,则至少应符合(并针对)C99进行编译,最好使用当前标准(C11)。