gpt4 book ai didi

c - 浮点函数总是返回 0.000000

转载 作者:行者123 更新时间:2023-12-02 07:19:04 27 4
gpt4 key购买 nike

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

这是代码

#include <stdio.h>

float function(x){
return x;
}

int main(){

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

return 0;
}

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

最佳答案

您将函数定义为:

float function(x){
return x;
}

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

float function(float x){
return x;
}

修复应该可以解决您的问题。您真的不需要担心为什么您的错误程序会以它的方式运行。

但是如果你好奇...

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

因此,当您使用 float 参数调用函数时,编译器不会报错,也不会将您的参数从 float 转换为 int 。相反,它会将您的参数从 float 提升为 double(这只是调用没有可见原型(prototype)的函数或调用像 这样的可变参数函数的规则之一printf),并且函数本身假定您确实向它传递了一个int

结果:行为未定义。

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

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

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

关于c - 浮点函数总是返回 0.000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957775/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com