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

yuv*_*uva 8 c precision io formatting printf

我正在重新编码printf,现在我被精度标志阻止了一会儿。所以我读到类型转换说明符d为 1时的默认精度:

默认精度

所以我认为%.dand之间没有区别%.1d,但是当我测试时:

printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud)

我确实找到了一个:

printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud)

Azi*_*ziz 5

如果.%没有指定精度的情况下使用after ,则将其设置为零。

printfcppreference.com 上的页面

.后跟整数或 *,或两者都不指定转换的精度。在使用 * 的情况下,精度由 int 类型的附加参数指定。如果此参数的值为负,则将其忽略。如果既不使用数字也不使用 *,则精度为零。

1如果您使用%d(不使用.),则默认为:

printf("d = %d, 1d= %1d", 0, 0);
# Output:   d = 0, 1d= 0
Run Code Online (Sandbox Code Playgroud)


Rob*_*rtS 5

C18 标准 - ISO/IEC 9899:2018 -(强调我的)规定:

"一个可选精度,它给出了 d、i、o、u、x 和 X 转换出现的最小位数,a、A、e、E 的小数点字符后出现的位数, f 和 F 转换,g 和 G 转换的最大有效位数,或 s 转换要写入的最大字节数。精度采用句点 (.) 后跟星号 * (稍后描述)或通过可选的非负十进制整数;如果仅指定了句点,则精度为零。 如果精度与任何其他转换说明符一起出现,则行为未定义。”

来源:C18,第 7.21.6.1/4 节

手段%.d等于%.0d和不同%.1d


此外:

"d,i - int 参数以 [-]dddd 样式转换为有符号十进制。精度指定要出现的最小位数;如果转换的值可以用更少的位数表示,则用前导零扩展. 默认精度为 1.以零精度转换零值的结果是没有字符。

来源:C18,第 7.21.6.1/8 节

这意味着如果您在调用中0使用 using转换值,则保证结果不会打印任何字符(这与您的测试体验相匹配)。%.dprintf()