我是C语言的初学者,我找不到解决此“错误”的方法... (我不想只打印用scanf读取的内容,那只是从更大的程序中提取的内容,所以您可以尝试不创建新代码而是对其进行修改吗?)
这是代码
#include <stdio.h>
float function(x){
return x;
}
int main(){
float x;
scanf("%f", &x);
printf("%f \n", function(x));
return 0;
}
如果您不介意...您能解释一下为什么这种方式不起作用的原因吗?非常感谢
答案 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;
}