我在用C:
编写的源代码中看到了以下行printf("%2$d %1$d", a, b);
这是什么意思?
答案 0 :(得分:24)
这是extension to the language added by 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 man pages找到更多信息。
答案 1 :(得分:11)
根据C规范C11dr 7.21.6.1
作为打印格式的一部分,%
中的第一个"%2$d %1$d"
引入了一个指令。该指令可能有各种标志,宽度,精度,长度修饰符,最后还有转换说明符。在这种情况下,2
是宽度。下一个字符$
既不是精度,长度修饰符也不是转换说明符。因此,由于转换规范无效,
......行为未定义。 C11dr 7.21.6.1 9
C规范讨论了未来的图书馆方向。可以在将来添加小写字母,并且可以在扩展中使用其他字符。当然$
不是小写字母,所以这对未来有好处。它当然适合“其他角色”角色,因为$
甚至不是C字符集的一部分。
在各种* nix实现中,$
用作Linux Programmer's Manual PRINTF(3)中的描述。 $
和前面的整数定义了宽度的参数索引。