浮点函数总是返回 0.000000

Mat*_*oli 2 c variables floating-point return function

我是 C 的初学者,我找不到这个“错误”的解决方案......(我不想只打印我用 scanf 读取的内容,这只是一个更大程序的摘录,所以你能尽量不要创建新代码而是修改它?)

这是代码

#include <stdio.h>

float function(x){
    return x;
}

int main(){

    float x;
    scanf("%f", &x);
    printf("%f \n", function(x));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你不介意......你能解释为什么它不能以这种方式工作吗?非常感谢

Kei*_*son 5

您将函数定义为:

float function(x){
    return x;
}
Run Code Online (Sandbox Code Playgroud)

如果你想让函数接受一个float参数,你需要这样说:

float function(float x){
    return x;
}
Run Code Online (Sandbox Code Playgroud)

修复它应该可以解决您的问题。你真的不需要担心为什么你的不正确的程序会这样。

但是如果你很好奇...

在 C99 标准之前,C 有一个“隐式int”规则。在这种情况下,参数x将是类型,int因为您没有明确指定其类型。但是由于您使用的是旧式定义,而不是原型,因此您没有告诉编译器参数应该是 type int。(是的,旧式的函数声明和定义会导致一些严重的问题。这就是我们有原型的原因。)

所以,当你调用函数与float参数,编译器不抱怨,它不会将您的论点floatint。相反,它会将您的参数从floatto提升double(这只是调用没有可见原型的函数或调用像 那样的可变参数函数的规则之一printf),并且函数本身假定您确实将int.

结果:行为未定义。

一个可能的结果是该函数会将double参数视为 type int,从而产生垃圾。另一个是它会int从其他内存位置或寄存器读取值,产生更糟糕的垃圾。

始终启用警告。始终注意编译器产生的任何警告。除非有特殊原因,否则请始终要求您的编译器符合 C99 或 C11 标准。并且始终使用原型声明和定义您的函数。(原型是指定参数类型的函数声明。)

这也意味着int main()应该是int main(void)。这不太重要(除非您main递归调用,这很愚蠢),但这是一个好习惯。