C中的函数返回类型冲突

时间:2015-07-24 15:27:46

标签: c

我正在研究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);
}

为什么会这样?

2 个答案:

答案 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);
  }

功能。此处xy都属于int类型,因此除法将为整数除法,结果为int类型。但是,由于您已将函数定义为返回类型为float,因此将生成返回类型不匹配。要解决此问题,您应该通过编写

来强制执行浮点除法
return ( (float)x / y );

然后,在main()内你正在使用

printf("%d",avg(50,20));

即,%d格式说明符用于打印float值。它调用undefined behaviour。您应该使用%f打印float