#include<stdio.h>
int main()
{
printf("%f",9/5);
return 0;
}
输出:0.000000
任何人都可以解释上述程序的输出吗?
不应该是程序的输出是1.000000?
答案 0 :(得分:5)
printf("%f",9/5);
此声明为未定义行为,因为参数必须为double
类型且9 / 5
类型为int
。
使用9 / 5.0
生成double
类型的参数(以及正确的浮动分区)。
答案 1 :(得分:4)
9/5
的类型为int
。使用int
将printf
参数传递给"%f"
具有未定义的行为。
如果您需要9.0/5.0
,请尝试1.800000
;如果需要(double)(9/5)
1.000000
答案 2 :(得分:2)
为什么会这样?
因此,通过划分两个整数得到9/5 - 并且将两个整数除以得到整数值,但是,因为它是一个int,并且指定的%f
想要一个浮点数,这是未定义的行为
Ps。:你可能想要
9.0 / 5
或
9 / 5.0
或
9.0 / 5.0
答案 3 :(得分:1)
Re:不应该是程序的输出是1.000000?
如果您的除法导致浮动值而不是int
,那么本来是这样的。由于您尝试使用int
格式规范打印%f
,因此结果为 undefined 行为。
更多详情:
有两个问题,但有关:
您正在从您的部门获得int
eger结果,但是
使用%f
(你的问题似乎意味着你知道这一点)整数
除法导致整数,这就是%f
格式的原因
说明符不合适。当格式说明符和
参数与行为不匹配 undefined 。
要避免整数结果,请尝试:
9.0 / 5
或9 / 5.0
或甚至9.0 / 5.0
获得您期望的结果,然后 %f
说明符将适当并按预期工作。
请注意,在进行整数除法时,结果将是另一个整数。但是,如果操作数的至少一个是浮点数,则另一个操作数也将被提升为浮点值,除法将导致浮点值。
使用整数除法会得到截断,这意味着结果的小数部分会被丢弃。
答案 4 :(得分:0)
这是因为9/5
是1并且是整数类型。小数部分简单地被截断。要实现您的目标,请强制分部使用5.0/9
或5/9.0
或5.0/9.0
或(float) 5/9
当整数参数的类型与%f
绑定时,行为未定义。
这在C99标准第7.21.6.1节第9段中有说明。本段引用如下:
如果转换规范无效,则行为为 未定义。 如果任何参数不是正确的类型 相应的转换规范,行为未定义。
答案 5 :(得分:0)
答案很简单。 9是整数,5也是整数。当整数除以整数时,结果将为0,并且它将升级到0.00000,因为你在printf()中使用了“%f” 如果您想要正确的结果执行 9.0 / 5 现在你肯定会得到正确的答案