浮点函数除法的函数声明中出现冲突类型错误

use*_*893 1 c floating-point runtime-error division function-declaration

这应该是一个递归函数,当 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

引起“冲突类型错误”的问题是在尝试调用函数的division()范围内没有函数声明。main()自 C99 以来,此类函数调用是不符合标准的,但许多编译器提供了在此类函数调用中使用的隐式声明,因为这是原始 C 的行为,并通过 C90 支持。

然而,在这种情况下使用的隐式声明相当于

int division(int i, int n, double h);
Run Code Online (Sandbox Code Playgroud)

,它与实际的函数签名不匹配且不兼容。当编译器稍后发现这一点时,它会发出诊断信息来警告您。可能它会因为这个原因拒绝代码——这个问题并不清楚。

要解决这种情况,您必须在(第一次)使用函数之前声明该函数。一种方法是移动divisionbefore的整个定义main(),但您也可以只在 before 中添加函数的前向声明main()。这看起来与上面(错误的)声明类似,但它会正确反映函数的真实返回类型和参数类型:

float division(int i, int n, float h);
Run Code Online (Sandbox Code Playgroud)