[英]Conflicting types error in the function declaration of a division with floating point function
这应该是一个递归函数,当 i 小于 'h' 时,它不断向 'h' 添加 1/i 的值,但是我在函数声明中不断收到冲突类型错误,我做错了什么? 它只是发生在浮动。
#include <stdio.h>
int main()
{
int i=0, n = 5;
float h;
division(i, n, h);
return 0;
}
float division(int i, int n, float h)
{
if(i<n)
{
h += 1/i;
division(i, n, h);
}
else
{
printf("the sum is: %f",h);
return h;
}
}
导致“类型冲突错误”的问题是在main()
尝试调用它的地方没有在作用域中声明函数division()
。 自 C99 以来,此类函数调用不符合标准,但许多编译器提供了用于此类函数调用的隐式声明,因为这是原始 C 的行为,并通过 C90 提供支持。
然而,在这种情况下使用的隐式声明将等效于
int division(int i, int n, double h);
,与实际函数签名不匹配且不兼容。 当编译器稍后发现时,它会发出诊断信息以警告您。 可能因为这个原因它拒绝了代码 - 从问题中不清楚。
要解决这种情况,您必须在(第一次)使用之前声明该函数。 一种方法是将division
的整个定义移动到main()
之前,但您也可以在main()
之前放置一个函数的前向声明。 这看起来类似于上面的(错误的)声明,但它会正确反映函数的真实返回类型和参数类型:
float division(int i, int n, float h);
float division(int i, int n, float h)
在声明之前使用,你应该在 main 之前放置一个声明,或者简单地将它移动到 main 之前。 这就是错误的原因,因为函数是隐式声明的,返回类型默认为 int 与定义冲突。
其他几个问题:
在同一个函数中,并不总是保证返回。
在行中
h += 1/i;
你有一个潜在的除以 0,这会导致未定义的行为。
h
未初始化使用,因为h
的值未知,添加到它也会调用未定义的行为。正如其他用户所建议的那样,其中一些问题会随着编译器警告的出现而变得明显。
在使用之前声明该函数。 要么将函数定义放在main
之前,要么插入声明float division(int i, int n, float h);
在主要之前。
这在现代 C 中是必需的,但如果您不提供,一些编译器将假定默认声明。 默认声明的返回类型为int
,这与函数的实际返回类型float
冲突。 这会导致错误消息。
打开编译器的警告消息并注意它们。
“冲突类型”之外的另一个问题:无限回归
如果i < n
,那么在递归调用中就是这样。
float division(int i, int n, float h) {
if(i<n) {
h += 1/i; // Note: integer division, like should be 1.0f/i;
division(i, n, h);
也许 OP 想要以下内容。 我不确定,但有些东西会改变i
。
division(i+1, n, h);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.