(GCC) printf格式字符串中的美元符号

28

我在一份C语言源代码中看到了以下这行代码:

printf("%2$d %1$d", a, b);

这是什么意思?

2个回答

32
这是关于编程的内容,需要翻译成中文。{和}符号内为需要翻译的内容:

这是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手册页面上找到。


15

根据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)所描述。与之前的整数一起,$定义了宽度参数的索引。


@Jens Gustedt 这个是否足够接近整个故事? - chux - Reinstate Monica
1
当谈到标准时,确切地说什么是需要说的。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接