2011-07-04 100 views
0

glibc的printf("% .0d",0)打印一个空格,并且printf("%+.0d",0)打印一个加号,并且glib printf测试检查此行为。但它是正确的吗?从标准(7.19.6.1)开始:应该printf(“%.0d”,0)打印一个空格吗? printf(“%+。0d”,0)打印一个加号?

+签名转换的结果总是以加号或减号开头。 (如果未指定此标志,则仅在转换为负值时才以符号开头)

空格如果签名转换的第一个字符不是符号,或者如果签名转换不生成任何字符,空格以结果为前缀。如果空格和+标志都出现,空格标志将被忽略。

然而,关于精度为d说明符:

转换零值为零的精度的结果是没有字符

当然这种“没有字符”的规则并不排除填充字段到所请求的宽度,但据我所知,该前缀空间或+是转换的一部分,并因而受到“无字符”规则。

这件事情有没有澄清过?

回答

3

不,它是在谈论没有修饰符的基本转换;这就是为什么修饰符特别说明当基本转换不产生字符时他们做了什么。

+1

对于空间这是显而易见的;不知道我是如何错过它的。对于plus来说,它似乎是不明确的.. –

+0

一般规则是格式化的结果应该是可预测的:数值转换遵循特定规则(尽可能;浮点本质上很难在CPU之间合理化),修饰符遵循非常简单的附加规则这不依赖于转换的结果。 – geekosaur