我一直想知道为什么printf("%.d", 0);
没有输出任何内容,而它输出的内容适用于0以外的任何其他数字,而printf("%d", 0);
输出' 0'如预期的那样。
两个代码之间的唯一区别是精度。以下是文档中关于精度的说明:
一个可选的精度,以句点的形式。接下来是 可选的数字串。如果省略数字字符串,则精度 被视为零。这会显示最小位数 对于d,i,o,u,x和X转换。
在这种情况下,应该忽略精度,不是吗?
答案 0 :(得分:4)
从文档(强调我的):
对于整数说明符(d,i,o,u,x,X):precision指定要写入的最小位数。如果要写入的值小于此数字,则结果将使用前导零填充。即使结果较长,也不会截断该值。 精度为0表示没有为值0写入字符。
不知道为什么,可能与C处理NULL指针的方式有关,或者@TripeHound指出,这可能是一个设计决定。
答案 1 :(得分:1)
对于x和X说明符,以交替形式(#标志)的有趣内容:
如果转换后的值是非零,则会在结果前添加0x或0X。
例如,printf("a = %#.0x", 0);
的结果为“ a =”
但是对于o指定者:
在可选的实现方式中,必要时可以提高精度, 写一个前导零。在这种情况下, 且精度为``0'',写入单个``0''。
因此,printf("a = %#.0o", 0);
的结果为“ a = 0”