未获得预期价值:为什么?

时间:2018-02-06 01:39:41

标签: c

我编写了这个非常简单和简短的代码,但是它不起作用:当我编译并执行函数时,返回的值 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;
}

2 个答案:

答案 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将打印整数。

Totalfloat,因此无效。

您必须使用float的正确说明符。

(你应该自己研究一下,而不是让我们给你答案)