我编写了这个非常简单和简短的代码,但是它不起作用:当我编译并执行函数时,返回的值 calculateCharges()在我的时候是0期待2。
有人可以解释原因吗?
#include <stdio.h>
#include <stdlib.h>
float calculateCharges(float timeIn);
int main()
{
printf("%d", calculateCharges(3.0));
return 0;
}
float calculateCharges(float timeIn)
{
float Total;
if(timeIn <= 3.0)
Total = 2.0;
return Total;
}
答案 0 :(得分:3)
此处至少存在三个问题,如果启用编译器警告(-Wall
命令行选项),并且导致未定义的行为,则其中两个应该很容易引起注意。< / p>
一个是printf
语句中的格式说明符错误。您正在打印一个浮点值wirh %d
,它是有符号整数的格式说明符。正确的说明符是%f
。
另一个是使用未初始化的值。如果函数中的Total
语句未通过,则变量if
可能未初始化,并且此类用法的行为未定义。
从我的观点来看,错误的格式说明符可能导致输出错误。但是也建议您解决上述第二个问题。
第三个问题与浮点精度有关。在float和double之间转换值可能不是安全的往返操作。
当3.0
双常量传递给calculateCharges()
时,它会被转换为浮点数。然后在timeIn <= 3.0
比较中将该值强制转换为两倍(以匹配3.0
的类型)。
像3.0
这样的值可能没问题,但在一般情况下它并不安全。例如,请参阅展示问题的这段代码。
#include <stdio.h>
#define EPI 2.71828182846314159265359
void checkDouble(double x) {
printf("double %s\n", (x == EPI) ? "okay" : "bad");
}
void checkFloat(float x) {
printf("float %s\n", (x == EPI) ? "okay" : "bad");
}
int main(void) {
checkFloat(EPI);
checkDouble(EPI);
return 0;
}
您可以从输出中看到,将其视为double
总是可以,但是当您转换为float
并失去精确度时却不是这样:
float bad
double okay
当然,如果您确保始终使用并检查正确的常量类型,例如使用3.0F
,问题就会消失。
答案 1 :(得分:0)
%d
将打印整数。
Total
是float
,因此无效。
您必须使用float
的正确说明符。
(你应该自己研究一下,而不是让我们给你答案)