浮动函数始终返回0.000000

时间:2018-06-20 22:10:41

标签: c function variables floating-point return

我是C语言的初学者,我找不到解决此“错误”的方法... (我不想只打印用scanf读取的内容,那只是从更大的程序中提取的内容,所以您可以尝试不创建新代码而是对其进行修改吗?)

这是代码

#include <stdio.h>

float function(x){
    return x;
}

int main(){

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

    return 0;
}

如果您不介意...您能解释一下为什么这种方式不起作用的原因吗?非常感谢

2 个答案:

答案 0 :(得分:4)

您将函数定义为:

float function(x){
    return x;
}

如果您希望函数采用float参数,则需要这样说:

float function(float x){
    return x;
}

修复该问题可以解决您的问题。您不必真的担心不正确的程序为何会表现出如此的行为。

但是,如果您很好奇...

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

因此,当您使用float参数调用函数时,编译器不会抱怨,也不会将参数从float转换为int。相反,它将您的参数从float提升到double(这只是调用没有可见原型的函数或调用printf之类的可变函数的规则之一),并且函数本身假设您确实将其传递给int

结果:该行为是不确定的。

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

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

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

答案 1 :(得分:1)

您从未定义函数参数x的类型。如果没有显式类型,则该类型默认为int。结果,传递给函数的float将转换为int并被截断。

将参数类型添加到函数定义中。

float function(float x){
    return x;
}