printf中的格式字符串

时间:2013-10-01 13:21:41

标签: c casting

输出是什么?

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最后的结果我不明白。

3 个答案:

答案 0 :(得分:4)

这个普通的undefined behavior用于指定printf的错误格式说明符,在i/a表达式中,double表达式将被提升为int,并且您指定它是7.19.6.1 {1}}一个参数。 printf 部分中的C99 draft standard fprintf函数 gcc的部分引用的格式字符串段落 9 表示:

  

如果转换规范无效,则行为未定义。[...]

您应该启用警告,但clanggcc都会发出警告,而不会启动警告,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