我理解%#x给出了与0x%x相同的效果,它符合POSIX标准。但人们提到一些编译器不支持它。这是真的吗,任何一个例子?
答案 0 :(得分:5)
除了一些破碎的嵌入式系统C库之外,#
修饰符应该得到普遍支持。但%#x
和0x%x
不一样。它们为值0产生不同的结果,#
修饰符将始终在与十六进制数字相同的情况下打印x
(例如%#x
给出0xa
和{{ 1}}使用%#X
)使用0XA
会允许您使用小写0x%X
和大写十六进制数字(在视觉上更令人愉悦,至少对我而言)。因此,我发现x
修饰符在实践中很少有用。
答案 1 :(得分:2)
%#x
是C89,C99和C11中printf
格式字符串中的有效转换规范。
答案 2 :(得分:2)
#
标志字符不是来自POSIX,而是来自C标准(§7.21.6.1)。如果编译器或库不支持它,那么它不是C编译器/标准库。
答案 3 :(得分:1)
这完全有效,符合C
规范 - 7.21.6.1 The fprintf function
- 点#6
#
结果转换为“替代形式”。对于o转换,它会增加 精度,当且仅在必要时,强制结果的第一个数字为a 零(如果值和精度均为0,则打印单个0)。对于x(或X) 转换时,非零结果的前缀为0x(或0X)。对于a,A,e,E,f,F,g, 和G转换,总是转换浮点数的结果 包含小数点字符,即使后面没有数字。 (通常,a 只有数字时,小数点字符才会出现在这些转换的结果中 跟着它。)对于g和G转换,尾随的零没有被删除 结果。对于其他转换,行为未定义。