该问题可能与已有的问题重复:如何使用%f格式化字符串来打印整数变量。请参考上述链接。可能是重复问题:
使用%f打印整数变量
#include<stdio.h>
int main()
{
printf("%f",9/5);
return 0;
}
输出:0.000000
有人能解释一下上面程序的输出吗?
程序的输出不应该是1.000000吗?
该问题可能与已有的问题重复:如何使用%f格式化字符串来打印整数变量。请参考上述链接。可能是重复问题:
使用%f打印整数变量
#include<stdio.h>
int main()
{
printf("%f",9/5);
return 0;
}
输出:0.000000
有人能解释一下上面程序的输出吗?
程序的输出不应该是1.000000吗?
printf("%f",9/5);
9/5
是一个 int
类型。如果你使用 "%f"
格式符将 int
参数传递给 printf
函数,那么行为是未定义的。
如果你想要得到 1.800000
,请尝试使用 9.0/5.0
;如果你想要得到 1.000000
,请使用 (double)(9/5)
。
9.0 / 5
或者
9 / 5.0
或者
9.0 / 5.0
回复:程序的输出应该是1.000000吗?
如果您的除法结果是浮点值而不是int
,那么输出确实会是1.000000。由于您尝试使用%f
格式说明符打印一个int
,所以结果是未定义行为。
更多细节:
有两个相关的问题:
您从除法中得到一个整数结果,但尝试使用%f
格式说明符格式化浮点值
(您的问题似乎暗示您已经意识到这一点) 整数除法会产生一个整数,这就是为什么%f
格式说明符不适用的原因。当格式说明符和参数不匹配时,行为是未定义的。
为了避免整数结果,请尝试:
9.0 / 5
或 9 / 5.0
或甚至 9.0 / 5.0
以获得您期望的结果,然后再使用%f
格式说明符即可按预期运行。
请注意,在进行整数除法时,结果将是另一个整数。但是,如果至少有一个操作数是浮点数,则另一个操作数也会被提升为浮点数,并且除法将产生浮点值。
使用整数除法会得到截断,这意味着结果的小数部分被舍去。
这是因为9/5
的结果是1,是整数类型。小数部分被简单地截断了。要实现您想要的效果,请强制使用浮点运算进行除法运算,例如5.0/9
或5/9.0
或5.0/9.0
或(float) 5/9
当整数参数的类型与%f
绑定时,行为是未定义的。
这在C99标准第7.21.6.1节第9段中说明。该段引用如下:
如果转换规范无效,则行为是未定义的。如果任何参数不是相应转换规范的正确类型,则行为是未定义的。
答案很简单。 9是整数,5也是整数。当整数被整数除时,结果将为0,并且它将升级为0.00000,因为您在printf()中使用了“%f”。 如果您想要正确的结果,请执行 9.0/5 现在你一定会得到正确的答案
printf
参数类型与格式字符串不匹配。 - Kos1.000000
,那么请使用(float)(9/5)
。似乎没有任何答案提到这一点的原因。 - Kosint
除法产生int
,并将结果传递给带有"%f"
的printf
。我不确定我是否见过具有该组合的问题。 - Keith Thompson