【问题标题】:Why can't i get the proper output by this code?为什么我不能通过这段代码得到正确的输出?
【发布时间】:2023-03-11 05:29:01
【问题描述】:

我正在解决一个困扰我一段时间的问题。还是无法理解。更改m的类型是有道理的,但是我仍然无法理解m在这个过程中经历了什么。它的价值如何变化? 下面是代码。

我已经在代码块上试过了。

#include<stdio.h>
int main()
{
    int m=5;
    m = (float)m / (2.0);//There, shouldn't m be 2.500000?
    printf("%f\n", m);
    printf("%0.2f\n",(float)m/2.0);
    getchar();
    return 0;
}

预期结果:

2.500000
1.25

实际结果:

nan
1.00

【问题讨论】:

  • 请下次正确格式化您的代码。我现在为你做了这件事,从现在开始请你自己做。
  • @clockstream 这个调用 printf("%f\n", m);具有未定义的行为,因为对 int 类型的对象使用了错误的格式转换说明符 %f,
  • m 的类型为 int。为其分配 floatdouble 值不会改变这一点 - 在分配之前,该值将转换为 int。 C 中的变量永远不会改变它们的类型。
  • 整数是整数,浮点数是浮点数。如果您尝试将浮点数存储在整数中,则变量的类型不会神奇地改变。相反,所有小数都将被删除。
  • @bolov 非常感谢。我正在学习如何去做。

标签: c output


【解决方案1】:

m 是一个int。所以如果你做m = (float)m / (2.0);,那么即使(float)m / (2.0)2.5,它也会被截断到m中存储为2。所以当你这样做时

printf("%f\n", m);

您的行为未定义,因为它是 int,而您说它是 float

稍后你会这样做

printf("%0.2f\n",(float)m/2.0);

你得到1.0,因为m2,然后你将它除以2.0。您可以通过将m 的类型改为float 来获得预期的输出。

【讨论】:

  • 非常感谢,我明白了。当我有另一个问题时,当我在 VC++ 上运行它时,它会得到答案:0.000000 1.00。是不是意味着nan等于0.000000?
  • 不完全。由于打印行表现出未定义的行为,任何事情都可能发生,无法保证结果会是什么。通常情况下,不同的编译器、不同的机器上的行为会有所不同,有时甚至在使用相同的配置多次运行时也会有所不同。这就是为什么未定义的行为如此成问题的原因 - 有时似乎一切正常,但当它很重要时,它突然中断。
  • 如果您有兴趣了解 IEEE 754(您的编译器最可能使用的浮点标准)中的 NaN 是什么,可以阅读 here
【解决方案2】:
printf("%f\n", m); // m is int

不。 "%f" 不适合 int

要么使用"%d",要么转换值

printf("%d\n", m);
printf("%f\n", (double)m);

请注意,转换为 float 会强制第二次自动转换为 double

printf("%f\n", (float)m); // convert twice

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多