【问题标题】:Should printf("% .0d",0) print a space? printf("%+.0d",0) print a plus?printf("% .0d",0) 应该打印一个空格吗? printf("%+.0d",0) 打印一个加号?
【发布时间】:2011-07-04 04:58:12
【问题描述】:

glibc 的printf("% .0d",0) 打印一个空格,printf("%+.0d",0) 打印一个加号,glib printf 测试检查这种行为。但它是正确的吗?来自标准(7.19.6.1):

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

space 如果有符号转换的第一个字符不是符号,或者如果有符号转换没有字符,则在结果前加一个空格。如果空格和 + 标志都出现,则忽略空格标志。

但是,关于 d 说明符的精度:

以零精度转换零值的结果是无字符

当然,这个“无字符”规则不排除将字段填充到请求的宽度,但据我所知,前缀空格或+ 是转换的一部分,并且因此受制于“无字符”规则。

这件事有没有澄清过?

【问题讨论】:

    标签: c standards printf language-lawyer


    【解决方案1】:

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

    【讨论】:

    • 一般规则是格式化的结果应该是可预测的:数字转换遵循特定的规则(在可能的范围内;浮点本质上很难在 CPU 之间合理化),修饰符遵循非常简单的附加规则不依赖于转换结果。
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多