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)
如果你不介意......你能解释为什么它不能以这种方式工作吗?非常感谢
您将函数定义为:
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参数,编译器不抱怨,它不会将您的论点float来int。相反,它会将您的参数从floatto提升double(这只是调用没有可见原型的函数或调用像 那样的可变参数函数的规则之一printf),并且函数本身假定您确实将int.
结果:行为未定义。
一个可能的结果是该函数会将double参数视为 type int,从而产生垃圾。另一个是它会int从其他内存位置或寄存器读取值,产生更糟糕的垃圾。
始终启用警告。始终注意编译器产生的任何警告。除非有特殊原因,否则请始终要求您的编译器符合 C99 或 C11 标准。并且始终使用原型声明和定义您的函数。(原型是指定参数类型的函数声明。)
这也意味着int main()应该是int main(void)。这不太重要(除非您main递归调用,这很愚蠢),但这是一个好习惯。