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

(GCC)printf格式字符串中的美元符号,c,gcc,format,printf,C,Gcc,Format,Printf,我在用C编写的源代码中看到了以下代码行: printf("%2$d %1$d", a, b); 这是什么意思?这是一种(符合C11的行为应如@chux的回答所述)。表示法%2$d与%d(输出带符号整数)的含义相同,不同之处在于它使用给定的基于1的数字格式化参数(在您的情况下,它是第二个参数,b) 因此,当您运行以下代码时: #include <stdio.h> int main() { int a = 3, b = 2; printf("%2$d %1$d", a,

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

printf("%2$d %1$d", a, b);
这是什么意思?

这是一种(符合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;
}
#包括
int main(){
INTA=3,b=2;
printf(“%2$d%1$d”,a,b);
返回0;
}
您将在标准输出中获得
23


根据C规范C11dr 7.21.6.1,可在上找到更多信息。

作为打印格式的一部分,
“%2$d%1$d”
中的第一个
%
引入了一个指令。此指令可能有各种标志、宽度、精度、长度修饰符,最后还有一个转换说明符。在这种情况下,
2
是一个宽度。下一个字符
$
既不是精度、长度修饰符,也不是转换说明符。因此,由于转换规范无效

。。。行为未定义。C11dr 7.21.6.1 9

C规范讨论了未来的库方向。将来可能会添加小写字母,扩展名中可能会使用其他字符。当然,
$
不是小写字母,所以这对将来是有好处的。它当然适合“其他字符”角色,因为
$
甚至不是C字符集的一部分


在各种*nix实现中,
$
如中所述使用。
$
以及前面的整数定义了宽度的参数索引。

@karthikr,回答了自己的问题。在这种情况下,我同意你的观点,它看起来像是一个公然的代表抓取,因为它只是重复文档中随时可用的信息。你没有讲述整个故事。这是C标准的一个不可移植的扩展。您至少应该解释一下它包含哪些C库实现。@CarlNorum作为Windows用户,我花了一个小时寻找该手册,所以对我来说它不像是rep grabbing。它不是一个GCC扩展,而是一个POSIX(Unix)扩展。GCC只是一个编译器,依赖系统libc来实现标准库。在标准库缺少此功能的系统上,例如MINGW Windows,GCC中也将缺少此功能。@Jens Gustedt这是否足够接近整个故事?当然,关于标准到底应该说些什么