我在一份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手册页面上找到。
根据C11标准规范7.21.6.1,作为打印格式的一部分,字符串"%2$d %1$d"中的第一个%
引入了指示符。此指示符可以具有各种标志、宽度、精度、长度修饰符和最终的转换说明符。在本例中,数字2
表示宽度。下一个字符$
既不是精度也不是长度修饰符或者转换说明符。因此由于转换说明符无效,
...其行为是未定义的。 C11dr 7.21.6.1 9
C标准讨论了未来库的发展方向。小写字母可能会添加到其中,而其他字符可能会用于扩展。当然,$
不是小写字母,这对未来是好的。它确实适合“其他字符”的角色,因为$
甚至不是C字符集的一部分。
在各种*nix实现中,$
被用作Linux Programmer's Manual PRINTF(3)所描述。与之前的整数一起,$
定义了宽度参数的索引。