(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)中用作描述。 $和前面的整数定义宽度的参数索引。