C 为什么printf(“值:%f”,10/2);输出0.000000?
我知道整数运算会截断分数,但这里它至少会打印5。为什么打印C 为什么printf(“值:%f”,10/2);输出0.000000?,c,floating-point,int,printf,C,Floating Point,Int,Printf,我知道整数运算会截断分数,但这里它至少会打印5。为什么打印0.000000?对printf的调用具有未定义的行为,因为转换说明符%f与表达式10/2的类型不对应,即int。由于表达式10/2的两个操作数的类型为int,因此结果的类型为int,因为它是两个操作数的共同类型 至少使用10.0/2。在本例中,表达式的类型为double 或者使用转换说明符%d或%i等输出整数表达式10/2 printf( "value: %d", 10 / 2 ); 来自C标准(7.21.6.1 fprintf函数)
0.000000
?对printf
的调用具有未定义的行为,因为转换说明符%f
与表达式10/2
的类型不对应,即int
。由于表达式10/2
的两个操作数的类型为int
,因此结果的类型为int
,因为它是两个操作数的共同类型
至少使用10.0/2
。在本例中,表达式的类型为double
或者使用转换说明符%d
或%i
等输出整数表达式10/2
printf( "value: %d", 10 / 2 );
来自C标准(7.21.6.1 fprintf函数)
9如果转换规范无效,则行为无效
未定义。275)如果任何参数不是
对应的转换规范,行为未定义
10
和2
无效float
s。它们是int
s
要使程序打印正确的输出,请执行以下操作:
printf("value:%f",10./2.);
注意每个数字后面的
。这向编译器表示该数字是一个浮点数。在C语言中,整数除法产生整数结果。如果尝试将浮点格式%f
与整数一起使用,则结果是未定义的行为。尝试将格式更改为%d
(或将除法结果转换为双精度
)。我们尝试了这些方法,我们可以通过类型转换和所有方法获得答案。但在这里,我们想找出printf()为何具有未定义的行为?如果可能的话,请帮助我们了解更多的细节,因为我们是学生,我们真的很想了解它。@Ganesh它的行为定义是不明确的。请参阅我的答案中C标准的引用。函数printf错误地解释了其参数,并且该参数的大小与double类型不同。@Ganesh当您选择printf中指定的格式时,您是在告诉printf实现将相应的参数视为适当的类型。您声称正在传递一个浮点,但实际上提供了int。实际上将发生什么取决于int函数和浮点数据是如何作为函数调用参数传递的,以及它们的内部表示,因此标准使它不被定义。我们可以考虑这个PRINTF(“值:%F”,10/2);作为带有无效参数的函数调用?@Ganesh是。您正试图将int
值打印为float
。