我正在研究C中的平均功能。通过使用加法和除法函数来实现平均功能。那是avg(x,y)=div(add(x,y),2)
。但错误发生在
"返回类型' div_t'时不兼容的类型但是'漂浮'预期"
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int add(int,int);
float avg(int,int);
float div(int,int);
printf("%d",avg(50,20));
return EXIT_SUCCESS;
}
int add(int x, int y){
return x+y;
}
float avg(int x, int y){
return div(add(x,y),2);
}
float div(int x, int y){
return (x/y);
}
为什么会这样?
答案 0 :(得分:6)
这里的主要问题是您声明的div
函数与标题(stdlib.h
)中定义的函数冲突。例如,将函数重命名为ddiv
将解决该特定问题。
正如其他评论者所指出的那样,第二个问题是你在main主体中提出了声明,因此函数avg
无法看到ddiv
的定义。这里的最佳实践是将所有前向声明移出,或者只是在定义其他函数后声明main
函数,并完全省略原型。
第三个问题,正确性,是你的div
函数在整数上运行,因此不会给出小数金额的正确答案(因此会返回50
而不是{{} 1}} 50.5
)。相反,您需要让avg(50,51)
函数采用浮点数,在这种情况下,编译器将自动执行正确的操作,或修改函数以计算div
。
最后一个问题是您在(float)x/y
中使用%d
打印出一个浮点数。编译器很可能会对此发出警告,但如果没有,您将会遇到奇怪的行为。请改用printf
。
答案 1 :(得分:4)
返回类型'div_t'时不兼容的类型,但预计会出现'float'“
此警告是因为原型与定义不匹配之间的不匹配。
如何强>
当您#include <stdlib.h>
时,prototype of div()
gets included。它是标准库中提供的实现。它说
div_t div(int numerator, int denominator);
现在,在代码中,您(重新)定义了一个名称为div()
并且签名为
float div(int x, int y)
因此,在调用div()
时,编译器会看到定义与声明不匹配。所以它会产生警告。
解决方案:使用其他名称,例如 版本的my_div()
。 Aslo,将函数的前向声明移到main()
body之外。
除了上述问题之外,在您的div()
版本中还有一个问题。在
float div(int x, int y){
return (x/y);
}
功能。此处x
和y
都属于int
类型,因此除法将为整数除法,结果为int
类型。但是,由于您已将函数定义为返回类型为float
,因此将生成返回类型不匹配。要解决此问题,您应该通过编写
return ( (float)x / y );
然后,在main()
内你正在使用
printf("%d",avg(50,20));
即,%d
格式说明符用于打印float
值。它调用undefined behaviour。您应该使用%f
打印float
。