为什么printf没有正确显示浮动?

Mac*_*eus 1 c floating-point printf casting

2.33但是,我希望在所有情况下都表明,只有在第二种情况下才出现这种情况?

printf("Without cast: %0.2f\n", 7 / 3); // Whitout cast: 0.00
printf("With cast: %0.2f\n", (float) 7 / 3); // With cast: 2.33
float x = 7 / 3;
printf("With var: %0.2f\n", x); // With var: 2.00
Run Code Online (Sandbox Code Playgroud)

我只是注意到浮动的这种行为.如果我使用整数变量,则不会发生.

mti*_*nic 5

7 / 3 没有强制转换是整数除法,导致整数2,因为任何余数都被丢弃,所以它相当于调用 printf("%0.2f\n", 2);

现在,为什么打印0而不是2?好吧,你告诉它它是格式字符串中的浮点数("%0.2 f ").所以它将你的整数(0b0 ... 000000000000010)解释为float.并且具有这些位设置的浮点数的计算结果为零,精度为%0.2f

您的编译器应该给您一个警告,告知格式说明符与传递的类型不匹配.不要忽略编译器警告!

使用强制转换是不同的,因为强制转换具有优先级,因此(float) 7 / 3是相同的7.0f / 3,这是浮点除法.使用变量,你进行了整数除法,最后得到了2,但是这两个被转换为浮点数,因此printf正确地解释了它.