gpt4 book ai didi

c - 未获取期望值 : why?

转载 作者:行者123 更新时间:2023-11-30 20:03:38 25 4
gpt4 key购买 nike

我编写了这段非常简单且简短的代码,但它不起作用:当我编译并执行函数 calculateCharges() 的返回值时,我期望的是 2,但返回值是 0。

谁能解释一下为什么吗?

#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;
}

最佳答案

这里至少存在三个问题,如果启用编译器警告(-Wall 命令行选项),其中两个应该很容易注意到,并且会导致未定义的行为

您的 printf 中的格式说明符有误。陈述。您正在打印一个浮点值 %d ,有符号整数的格式说明符。正确的说明符是 %f .

另一种是使用未初始化的值。变量Total如果 if可能未初始化函数中的语句未执行,并且此类用法的行为未定义。

从我的角度来看,可能是错误的格式说明符导致了错误的输出。但也建议您解决上述第二个问题。

第三个问题与浮点精度有关。在 float 和 double 之间转换值可能不是是安全的往返操作。

您的3.0当传递给 calculateCharges() 时,双常量被强制转换为 float 。然后将该值转换为 timeIn <= 3.0 中的 double 值。比较(以匹配 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 ,问题就会消失。 .

关于c - 未获取期望值 : why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48634203/

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