22

我在用 C 编写的源代码中看到了以下行:

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

这是什么意思?

4

2 回答 2

27

它是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 手册页中找到。

于 2013-10-11T21:20:17.560 回答
14

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

于 2013-10-12T01:28:20.770 回答