6 回答
printf("%f",9/5);
该语句是未定义的行为,因为参数必须是 typedouble并且9 / 5是 type int。
用于9 / 5.0具有类型的参数double(以及正确的浮动除法)。
9/5是类型int。int将参数传递给printfwith"%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,因此结果是未定义的行为。
更多细节:
有两个相关的问题:
您从除法中得到了
integer 结果,但尝试使用浮点值的格式%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.0or进行浮点运算(float) 5/9
当整数参数的类型与 绑定时%f,则行为未定义。
这在 C99 标准第 7.21.6.1 节第 9 节中进行了说明。该段引述如下:
如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。