我知道 %#x 具有与 0x%x 相同的效果,并且它符合 POSIX 标准。但人们提到有些编译器不支持它。是这样吗,有例子吗?
除了一些损坏的嵌入式系统 C 库之外,
#
修饰符应该得到普遍支持。然而 %#x
和 0x%x
并不相同。它们对于值 0 产生不同的结果,并且 #
修饰符将始终以与十六进制数字相同的情况打印 x
(例如 %#x
给出 0xa
和 %#X
给出 0XA
)。 0x%X
可以让你拥有小写的 x
和大写的十六进制数字(视觉上更令人愉悦,至少对我来说)。因此,我发现 #
修饰符在实践中很少有用。
%#x
是 C89、C99 和 C11 中 printf
格式字符串的有效转换规范。
#
标志字符不是来自 POSIX,而是来自 C 标准(第 7.21.6.1 节)。 如果编译器或库不支持它,那么它就不是 C 编译器/标准库。
根据
C
规范,这完全有效 - 7.21.6.1 The fprintf function
- 点 #6
#
结果被转换为“替代形式”。对于 o 转换,它增加 精度,当且仅当必要时,强制结果的第一个数字为 零(如果值和精度均为 0,则打印单个 0)。对于 x(或 X) 转换时,非零结果的前缀为 0x(或 0X)。对于 a、A、e、E、f、F、g, 和 G 转换,始终转换浮点数的结果 包含小数点字符,即使其后没有数字。 (通常,一个 仅当数字为小数点字符时,这些转换的结果中才会出现小数点字符 )对于 g 和 G 转换,尾随零不会从 结果。对于其他转换,行为未定义。