C printf中的格式字符串
输出是什么C printf中的格式字符串,c,casting,C,Casting,输出是什么 main() { float a=4; int i=2; printf("%f %d",i/a,i/a); printf("%d %f",i/a,i/a); } 我得到的答案是:0.5000000.000000 原因:在第一个printf,%f=i/a=2/4=int/float中,隐式转换完成,i变为float,从而导致float的结果(即0.500000) 浮点的默认精度为6,所以在十进制6位之后,然后是下一个%d=i/a=2/4=0.50000
main()
{
float a=4;
int i=2;
printf("%f %d",i/a,i/a);
printf("%d %f",i/a,i/a);
}
我得到的答案是:0.5000000.000000
原因:在第一个printf
,%f=i/a=2/4=int/float
中,隐式转换完成,i
变为float
,从而导致float
的结果(即0.500000)
浮点的默认精度为6,所以在十进制6位之后,然后是下一个%d=i/a=2/4=0.500000
,但是%d
格式字符串只打印整数,所以在十进制值之后,打印0
下一步printf
与%d=i/a=2/4
print0具有相同的概念;但是,%f=i/a=2/4=0.000000
我不理解的最后一个结果。未定义的行为:printf
中的所有数据类型都是隐式浮动的。这是因为i/a
具有类型float
,因为int
数据被提升为浮点。因此,您必须在printf
中专门使用%f
,printf
指定错误的格式说明符。在这两种情况下,i/a
表达式将升级为double
,并且您正在为一个参数指定它是int
。在7.19.6.1
一节中,printf
一节为格式字符串引用的fprintf函数第9段说:
如果转换规范无效,则行为未定义。[…]
您应该启用警告,但是gcc
和clang
都将对此发出警告,而不会启动它们,在gcc
中,我获得以下消息:
warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘double’ [-Wformat]
i/a
表达式将始终计算为float
,因为其中一个操作数是float
。打印时,我们使用的是说明符%d
和%f
。因此,当我们使用%f
时,它将(应该)始终是0.5,当我们使用%d
时,它应该是未定义的
在使用gcc编译器的Linux(ubuntu)上,我得到以下输出(为了清晰起见,在第一次打印后添加了一个\n
):
为什么不试试呢?你可以尝试各种各样的东西,即使不是在一台装有所有需要的东西的电脑前……你能确切地说明你不明白的是什么吗?“隐式铸造”是一种矛盾修饰法。铸造是明确的定义。您要查找的单词是“隐式转换”。还可以使用`标记内联代码,这样您编写的代码对我们的视觉效果会更好。我只看到3个输出,但看到4个格式参数到printf
。您确定吗?int
会不会被提升为float
?@Bathsheba您是对的,i/a
是float
,但是在像printf
这样的变量参数函数中,float
被提升为double
。
0.500000 2047229448
899608576 0.500000