输出是什么?
main()
{
float a=4;
int i=2;
printf("%f %d",i/a,i/a);
printf("%d %f",i/a,i/a);
}
我收到的答案是:0.500000 00 0.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
print 0的下一个%d=i/a=2/4
具有相同的概念;但是,%f=i/a=2/4=0.000000
最后的结果我不明白。
答案 0 :(得分:4)
这个普通的undefined behavior用于指定printf
的错误格式说明符,在i/a
表达式中,double
表达式将被提升为int
,并且您指定它是7.19.6.1
{1}}一个参数。 printf
部分中的C99 draft standard fprintf函数 gcc
的部分引用的格式字符串段落 9 表示:
如果转换规范无效,则行为未定义。[...]
您应该启用警告,但clang
和gcc
都会发出警告,而不会启动警告,warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘double’ [-Wformat]
我收到以下消息:
{{1}}
答案 1 :(得分:3)
i/a
表达式将始终计算为float
,因为其中一个操作数为float
。在打印时,我们使用说明符%d
和%f
。因此,当我们使用%f
时,它(应该)始终为0.5,当我们使用%d
时,它应该是undefined
。
在使用gcc编译器的Linux(ubuntu)上,我得到以下输出(为了清楚起见,在第一次打印后添加了\n
):
0.500000 2047229448
899608576 0.500000
答案 2 :(得分:2)
未定义的行为:printf
中的所有数据类型都是隐式浮动的。这是因为i/a
具有类型float
,因为int
数据被提升为浮点数。因此,您必须在%f
。
printf