printf("%.d", 0) 和 printf("%.1d", 0) 有什么区别?

8
我正在重新编写printf,目前被精度标志阻塞了。然后我读到,当类型转换说明符为d时,默认的精度是1:default precison
所以我认为在%.d%.1d之间没有区别,但是当我测试时:
printf(".d =%.d, .1d= %.1d", 0, 0);

我找到了一个:

.d =, .1d= 0

2
参见C11 7.21.6.2"%.d"等同于"%.0d" - pmg
3个回答

5
如果在%后使用.而不指定精度,则精度将设置为零。

来自cppreference.com上的printf页面

.后跟整数或*,或者两者都没有,指定转换的精度。当使用*时,精度由类型为int的附加参数指定。如果此参数的值为负,则会被忽略。如果既不使用数字也不使用*,则精度视为零。

如果您使用%d(没有.),它默认为1

printf("d = %d, 1d= %1d", 0, 0);
# Output:   d = 0, 1d= 0

5
C18标准 - ISO/IEC 9899:2018 - (强调我的)说明:
“一个可选的精度,用于为d、i、o、u、x和X转换指定最少要显示的数字位数,为a、A、e、E、f和F转换指定小数点后要显示的数字位数,为g和G转换指定最多要显示的有效数字位数,或者为s转换指定要写入的最大字节数。精度采用句点(.)加上一个星号*(稍后描述)或可选的非负十进制整数的形式;如果只有句点被指定,则将精度视为零。 如果任何其他转换说明符与精度一起出现,则行为未定义。”
意味着%.d等同于%.0d,并且不同于%.1d
此外:
“d,i——将int参数转换为[-]dddd风格的有符号十进制数。精度指定要显示的最少位数;如果要转换的值可以用更少的位数表示,则使用前导零进行扩展。默认精度为1。使用精度为零将零值转换的结果为无字符。
这意味着如果您在printf()调用中使用%.d将一个0值转换,结果保证不打印任何字符(与测试经验相匹配)。

1
当精度设置为零或其值被省略时,如下所示:
printf( "%.d", x )'

根据转换说明符d和i的描述(7.21.6.1 fprintf函数),将int参数转换为带符号的十进制样式[−]dddd。精度指定要显示的最小数字数;如果要转换的值可以用较少的数字表示,则会使用前导零进行扩展。默认精度为1。使用精度为零将零值转换的结果为无字符。

以下是演示程序

#include <stdio.h>

int main(void) 
{
    printf( "%.d\n", 0 );
    printf( "%.0d\n", 0 );
    printf( "%.1d\n", 0 );      
    return 0;
}

它的输出是:
0

当精度等于0或其值不存在时,如果指定0作为参数,则不会输出任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接