无法在 C 中传递浮点值

the*_*12k 0 c

在我的程序中,我有这样的要求,我必须将浮点值传递回主函数。

第一种方法的代码是:

#include <stdio.h>
void main()
{
    int a,b;
    a=1;
    b=2;
    division(a,b);
}

int division(int a, int b)
{
    float res;
    res=((float) a)/b;
    printf("%f",res);
}
Run Code Online (Sandbox Code Playgroud)

第二种方法的代码(我将浮点值传递回主函数)是这样的:

#include <stdio.h>
void main()
{
    int a,b;
    a=1;
    b=2;
    float res;
    res=division(a,b);
    printf("%f",res);

}

int division(int a, int b)
{
    float res;
    res=((float) a)/b;
    return res;
}
Run Code Online (Sandbox Code Playgroud)

对于第一种方法,输出为0.5,正如预期的那样。但是,当我传递结果时float(如下一个程序所示),我得到的输出为0. 为什么会出现这种情况?有什么解决方法吗?我对 C 比较陌生(尝试了 Java 之外的东西),所以我不太熟悉它的规则。当我修改int division为包含printf变量的语句时res,例如

int division(int a, int b)
{
    float res;
    res=((float) a)/b;
    printf("Variable before passing %f ",res);
    return res;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出为Variable before passing 0.500000 0.000000,这让我相信问题在于将参​​数传递回主函数。

Som*_*ude 5

代码和函数实际上存在两个division问题:

  1. 它声明返回 anint而不是 a floatfloat这会导致从到 的转换被截断int

  2. 第二个问题是你需要在调用函数之前声明它。C 曾经有隐式声明,其中调用先前未声明的函数将使编译器假定该函数的参数和返回类型。假设之一是该函数返回一个int. 如果您更正该division函数,您将使其与编译器的隐式声明不匹配。

为了解决这两个问题,我建议您division将要定义(和声明)的函数移到main函数之前,并使用正确的类型。

我还建议您使用double而不是floatas 类型,并且也这样声明参数。

所以也许是这样的:

#include <stdio.h>

double division(double a, double b)
{
    // Exercise for reader: To protect against division by zero
    return a / b;
}

int main(void)
{
    int a = 1;
    int b = 2;
    printf("%f\n", division(a, b));
}
Run Code Online (Sandbox Code Playgroud)

main请注意,我将from的返回类型更改voidintmain函数被指定为始终返回一个int. 但是,您不需要在函数return中显式声明main,如果您省略它,编译器将return 0;在末尾隐式添加 a 。