【问题标题】:C integer and float division outputC整数和浮点除法输出
【发布时间】:2018-10-28 12:40:50
【问题描述】:

谁能解释以下代码的输出: http://cpp.sh/9dy44

为什么最后一行总是0.17?

float a = 17, b = 100;

printf("%f\n", 17/100);
printf("%f\n", a/b);
printf("%f\n", 17/b);
printf("%f\n", 17.0f/b);
printf("%f\n", a/100);
printf("%f\n", a/100.0f);
printf("%f\n", 5/100);

输出

0.000000
0.170000
0.170000
0.170000
0.170000
0.170000
0.170000

【问题讨论】:

标签: c integer division


【解决方案1】:

这叫Undefined Behaviour,不要试图理解为什么会这样,因为顾名思义,它是undefined!。发生未定义的行为是因为您尝试打印 double 但您传递了两个 integers 。请注意,您还会收到警告:

14:25:警告:格式“%f”需要“double”类型的参数,但参数 2 的类型为“int”[-Wformat=]

把最后一行改成这样:

    printf("%f\n", 5.0/100);

它会按预期工作。

【讨论】:

  • 我原以为最后一行的输出会是 0,有没有解释为什么它坚持使用 0.17?
  • 您将使用的每个编译器可能有不同的行为,一个会打印 0,另一个会打印 0.17,另一个会打印 2。为什么?因为它是未定义的。
  • 如果你有兴趣了解更多 - 谷歌:C Undefined behaviour,有很多关于这个主题的文章。
  • 好的,谢谢...我只是想知道为什么第一个和最后一个 printf 的行为如此不同
  • 告诉别人“不要试图理解”是有害的。虽然未由 C 标准定义的行为可能令人困惑,并且并非严格要求编写可工作的 C 程序,但理解它仍然有好处。它提供了对编译器、处理器和其他系统组件如何工作的洞察力,这种洞察力既有助于诊断错误,又有助于了解纯 C 之外的事物。在这种情况下,用于传递浮点参数的寄存器中留下的浮点值通过打印a/b 或17.0f/b 保留在寄存器中以供后续调用printf,因此它被重用。
【解决方案2】:

因为您正在除以整数,而不是尝试打印(整数结果为)浮点值

试试这个

// Example program
#include <stdio.h>

int main()
{
    float a = 17, b = 100;

    printf("%f\n", 17.0/100);
    printf("%f\n", a/b);
    printf("%f\n", 17/b);
    printf("%f\n", 17.0f/b);
    printf("%f\n", a/100);
    printf("%f\n", a/100.0f);
    printf("%f\n", 5.00/100);

    return 0;
}

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2023-03-25
    • 2011-04-19
    • 2013-02-07
    相关资源
    最近更新 更多