我在用 C 编写的源代码中看到了以下行:
printf("%2$d %1$d", a, b);
这是什么意思?
它是POSIX 添加的语言的扩展(符合 C11 的行为应如 @chux 的回答中所述)。表示法%2$d
的含义与%d
(输出有符号整数)相同,只是它使用给定的基于 1 的数字格式化参数(在您的情况下,它是第二个参数b
)。
因此,当您运行以下代码时:
#include <stdio.h>
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
作为打印格式的一部分,第一个%
in"%2$d %1$d"
引入了一个指令。该指令可能有各种标志、宽度、精度、长度修饰符,最后还有一个转换说明符。在这种情况下2
是宽度。下一个字符$
既不是精度、长度修饰符也不是转换说明符。因此,由于转换规范无效,
...行为未定义。 C11dr 7.21.6.1 9
C 规范讨论了未来的库方向。将来可能会添加小写字母,并且可能会在扩展中使用其他字符。当然$
不是小写字母,这样对以后有好处。它当然适合“其他字符”角色,因为$
它甚至不是 C 字符集的一部分。
在各种 *nix 实现中,$
如Linux Programmer's Manual PRINTF(3)中所述使用。,$
与前面的整数一起定义宽度的参数索引。