6 回答
printf("%f",9/5);
该语句是未定义的行为,因为参数必须是 typedouble
并且9 / 5
是 type int
。
用于9 / 5.0
具有类型的参数double
(以及正确的浮动除法)。
9/5
是类型int
。int
将参数传递给printf
with"%f"
具有未定义的行为。
9.0/5.0
如果你想试试1.800000
,或者(double)(9/5)
如果你想1.000000
为什么是这样?
所以 9 / 5 是通过将两个整数相除得到的——两个整数相除得到一个整数值 1。但是,由于它是一个 int,并且%f
指定的对象需要一个浮点数,因此这是未定义的行为。
Ps.:你可能想要
9.0 / 5
或者
9 / 5.0
或者
9.0 / 5.0
回复:程序的输出不应该是 1.000000 吗?
如果您的除法会导致浮点值而不是int
. 由于您尝试int
使用 %f
格式规范打印 an,因此结果是未定义的行为。
更多细节:
有两个相关的问题:
您从除法中得到了
int
eger 结果,但尝试使用浮点值的格式%f
(您的问题似乎暗示您知道这一点)整数除法会产生一个整数,这就是
%f
格式说明符不合适的原因。当格式说明符和参数不匹配时,行为是undefined。为避免整数结果,请尝试:
9.0 / 5
或者9 / 5.0
甚至9.0 / 5.0
获得您期望的结果,然后说明
%f
符将是适当的并按预期工作。请注意,当您进行整数除法时,结果将是另一个整数。但是,如果至少一个操作数是浮点数,则另一个操作数也将提升为浮点数,并且除法将产生浮点值。
使用整数除法,您会得到截断,这意味着结果的小数部分被丢弃。
答案很简单。9 是整数,5 也是整数。当整数除以整数时,结果将为 0 并将升级为 0.00000,因为您在 printf() 中使用了 "%f" 如果您想要正确的结果,请执行 9.0/5 现在您肯定会得到正确的回答
那是因为9/5
是 1 并且是整数类型。小数部分被简单地截断。5.0/9
要实现您想要的,请强制除法使用or5/9.0
或5.0/9.0
or进行浮点运算(float) 5/9
当整数参数的类型与 绑定时%f
,则行为未定义。
这在 C99 标准第 7.21.6.1 节第 9 节中进行了说明。该段引述如下:
如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。