【问题标题】:Anomalous behavior of printf()? [duplicate]printf() 的异常行为? [复制]
【发布时间】:2012-07-28 17:38:12
【问题描述】:

可能重复:
Using %f to print an integer variable

#include<stdio.h>

int main()
{
    printf("%f",9/5);
    return 0;   
}

输出:0.000000

谁能解释一下上述程序的输出?

程序的输出不应该是 1.000000 吗?

【问题讨论】:

  • 启用您的编译器警告,您应该会收到通知printf 参数类型与格式字符串不匹配。
  • 另外,如果你想要输出1.000000 然后使用(float)(9/5),似乎由于某种原因没有答案提到
  • @pb2q:这并不是那个问题的真正重复。这个有两个问题:int 除法产生int,并将结果传递给printf"%f"。我不确定我是否看到过与该组合相关的问题。
  • 不过,OP 仍然知道 int 除法。如果它不被认为是问题的一部分,它确实会添加一个不必要的层,是的。
  • @Kos: gcc 给出警告;其他编译器呢?你也可以投到double,因为无论如何它都会被提升。

标签: c


【解决方案1】:
printf("%f",9/5);

此语句是未定义行为,因为参数必须是 double 类型,而 9 / 5int 类型。

使用9 / 5.0 获得double 类型的参数(以及正确的浮点除法)。

【讨论】:

    【解决方案2】:

    9/5 的类型为 int。使用 "%f"int 参数传递给 printf 具有未定义的行为。

    如果需要1.800000,请尝试9.0/5.0,如果需要1.000000,请尝试(double)(9/5)

    【讨论】:

      【解决方案3】:

      这是为什么?

      所以 9 / 5 是通过将两个整数相除得到的——两个整数相除得到一个整数值 1。但是,由于它是一个 int,并且指定的 %f 需要一个浮点数,因此这是未定义的行为。

      Ps.:你可能想要

      9.0 / 5
      

      9 / 5.0
      

      9.0 / 5.0
      

      【讨论】:

      • 崩溃本来是一件好事;它会清楚地表明存在问题。
      • @KeithThompson 而你实际上给了我一个-1?
      • 不,不是我。这只是对您的回答的评论,而不是对您的评论的回应。
      • @KeithThompson 啊好的。我将编辑我的答案。
      【解决方案4】:

      Re: 程序的输出不应该是 1.000000 吗?

      如果您的除法会产生一个浮点值而不是int。由于您尝试使用%f 格式规范打印int,结果是未定义 行为。

      更多细节:

      有两个相关的问题:

      1. 您正在从您的部门获得integer 结果,但是 尝试使用 %f

      2. 格式化浮点值
      3. (您的问题似乎暗示您知道这一点)整数 除法产生一个整数,这就是%f 格式的原因 说明符不合适。当格式说明符和 参数不匹配的行为是未定义

        要避免整数结果,请尝试:

        9.0 / 59 / 5.0 甚至9.0 / 5.0

        要获得您所期望的结果,然后%f 说明符将是合适的并按预期工作。

        请注意,当您进行整数除法时,结果将是另一个整数。但是,如果至少一个操作数是浮点数,则另一个操作数也将被提升为浮点数,除法将产生浮点值。

        整数除法会被截断,这意味着结果的小数部分被丢弃。

      【讨论】:

      • 如果这将是整数除法的示例,则输出应为 1.0,但输出为 0.0。那是因为 %f 格式需要一个双精度,而他提供了一个 int。
      • @Femaref 同意,当您发表评论时,我正在调整我的答案:) .. 谢谢。
      【解决方案5】:

      那是因为9/5 是 1 并且是整数类型。小数部分被简单地截断。为了达到你想要的,强制除法使用5.0/95/9.05.0/9.0(float) 5/9进行浮点运算

      当整数参数类型与%f 绑定时,行为未定义。

      这在 C99 标准第 7.21.6.1 节第 9 节中有说明。下面引用该段:

      如果转换规范无效,则行为是 不明确的。 如果任何参数不是正确的类型 相应的转换规范,行为未定义。

      【讨论】:

      • 没有。输出是 0.0,而不是 1.0。那是因为他试图以 %f 作为格式显示一个 int。
      【解决方案6】:

      答案很简单。 9 是整数,5 也是整数。当整数除以整数时,结果将为 0 并将升级为 0.00000,因为您在 printf() 中使用了“%f” 如果你想要正确的结果执行 9.0/5 现在你一定会得到正确的答案

      【讨论】:

      • 这如何为 20 分钟前发布的答案添加新内容?
      • @Levon 答案很简单:因为输入 SO 的速度比光速还快,所以新用户无法遵循这一点,显然他们在意识到其他人已经回答之前就回答了;)
      猜你喜欢
      • 2019-12-02
      • 2022-01-25
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多