C 为什么printf(“值:%f”,10/2);输出0.000000?

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函数)

我知道整数运算会截断分数,但这里它至少会打印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函数)

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