5
4

6 回答 6

5
printf("%f",9/5);

该语句是未定义的行为,因为参数必须是 typedouble并且9 / 5是 type int

用于9 / 5.0具有类型的参数double(以及正确的浮动除法)。

于 2012-07-28T17:40:02.080 回答
4

9/5是类型intint将参数传递给printfwith"%f"具有未定义的行为。

9.0/5.0如果你想试试1.800000,或者(double)(9/5)如果你想1.000000

于 2012-07-28T17:39:35.597 回答
3

为什么是这样?

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

Ps.:你可能想要

9.0 / 5

或者

9 / 5.0

或者

9.0 / 5.0
于 2012-07-28T17:41:32.710 回答
2

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

如果您的除法会导致浮点值而不是int. 由于您尝试int使用 %f格式规范打印 an,因此结果是未定义的行为。

更多细节:

有两个相关的问题:

  1. 您从除法中得到了integer 结果,但尝试使用浮点值的格式%f

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

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

    9.0 / 5或者9 / 5.0甚至9.0 / 5.0

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

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

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

于 2012-07-28T17:38:55.193 回答
0

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

于 2012-07-28T17:58:32.083 回答
0

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

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

这在 C99 标准第 7.21.6.1 节第 9 节中进行了说明。该段引述如下:

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

于 2012-07-28T17:39:05.107 回答