(GCC)美元符号printf格式字符串
我在用C编写的源代码中看到了以下行:
printf("%2$d %1$d", a, b);
这是什么意思?
它是POSIX添加的语言的扩展 (符合C11的行为应该如@chux的回答中所述)。 符号%2$d
表示与%d
(输出有符号整数)相同,除非它使用给定的基于1的数字格式化参数(在您的情况下,它是第二个参数, b
)。
因此,当您运行以下代码时:
#include int main() { int a = 3, b = 2; printf("%2$d %1$d", a, b); return 0; }
你将获得标准输出2 3
。
更多信息可以在printf手册页上找到。
根据C规范C11dr 7.21.6.1
作为打印格式的一部分, "%2$d %1$d"
的第一个%
引入了一个指令。 该指令可能有各种标志,宽度,精度,长度修饰符,最后还有转换说明符。 在这种情况下, 2
是宽度。 下一个字符$
既不是精度,长度修饰符也不是转换说明符。 因此,由于转换规范无效,
……行为未定义。 C11dr 7.21.6.1 9
C规范讨论了未来的图书馆方向。 可以在将来添加小写字母,并且可以在扩展中使用其他字符。 当然$
不是小写字母,所以这对未来有好处。 它肯定符合“其他角色”的角色,因为$
甚至不是C字符集的一部分。
在各种* nix实现中, $
在Linux程序员手册PRINTF(3)中用作描述。 $
和前面的整数定义宽度的参数索引。