以下代码始终打印"0.00"
。我期待"7888"
。我应该将其转换为double
吗?
long l = 7888;
printf("%.2f", l);
答案 0 :(得分:13)
%.2f
不是long
的有效格式。你可以把它加倍:
long l = 7888;
printf("%.2f", (double)l);
Here是一个表格(向下滚动一下),您可以在其中查看所有数字类型允许的代码。
答案 1 :(得分:8)
%f
预计double
和l
变量很长。 printf()
不会将其参数转换为格式说明符 all-by-yourself 所需的类型。
FWIW,printf()
是variadic function,默认参数提升规则适用于提供的参数,并且它也不会将long
更改为double
。如果有的话,你希望转换发生,你必须明确地投射参数值。
你需要写一些像
这样的东西printf("%.2f", (double)l);
请注意,此代码会调用undefined behaviour,而不会使用显式强制转换。参考,C11
,章节§7.21.6.1,fprintf()
[....]如果有任何论据 不是相应转换规范的正确类型,行为是未定义的。
答案 2 :(得分:7)
%f
格式说明符需要double
,但您要将long
传递给%ld
,以便进行未定义的行为。
如果要正确打印,则需要使用long
格式说明符将其打印为printf("%ld", l);
:
l
或将double
转换为printf("%.2f", (double)l);
以将其打印为浮点数:
{{1}}
答案 3 :(得分:3)
I was expecting "7888".
这是因为您尝试使用FLOAT标识符打印LONG。 如果您打开设置,编译器会抱怨:
program.c:5:5: error: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘long int’ [-Werror=format=] printf("%f", l); ^ cc1: all warnings being treated as errors
Should I convert it to double?
顺便说一下,如果这是你真正需要的话,你也可以施展它。
我认为这是你真正需要的:
#include<stdio.h>
int main(void){
long l = 7888;
printf("%ld", l);
return 0;
}
7888
答案 4 :(得分:1)
你不能使用浮点标识符打印一个长的proberly。你想做什么?