2011-06-12 73 views
11

通过man我发现

   printf("%*d", width, num); 

   printf("%2$*1$d", width, num); 

是等价的。

但IMO第二风格应该是一样的:

   printf("%*d", num, width); 

但是通过测试似乎man是正确的;为什么?

+4

你问“为什么'人'是对的?”毕竟,这是文档。 – Vlad 2011-06-12 14:43:57

+1

'2 $ *'应该匹配第二个参数,而'1 $ d'应该匹配第一个参数,但事实证明,在printf(“%2 $ * 1 $ d”,width, num);' – 2011-06-12 14:47:55

回答

21

printf() POSIX规范的相关部分定义该行为:

换算可以在格式后在参数列表中被施加到Ñ个参数,而不是下一个未使用的论据。在这种情况下,转换说明符字符%(见下文)被替换为序列“%n $”,其中n是范围[1,{NL_ARGMAX}]中的十进制整数,给出参数的位置参数列表。此功能提供了格式字符串的定义,以适合特定语言的顺序选择参数(请参阅“示例”部分)。

格式可以包含编号参数转换规范(即“%n $”和“* m $”)或无编号参数转换规范(即%和*),但不能同时包含二者。唯一的例外是%%可以与“%n $”表单混合使用。格式字符串中编号和无编号参数说明的混合结果未定义。使用编号参数规范时,指定参数 N th参数要求在格式字符串中指定从第一个到第()个th的所有前导参数。

在包含“%n $”形式的转换规范的格式化字符串中,参数列表中的编号参数可根据需要多次从格式字符串中引用。

%n$标识要打印其值的参数 - 在您的示例中为参数2。

*n$标识的参数的值将被视为格式宽度 - 在您的示例中的参数1。

所以,写手册的人遵循标准。


您认为在一个评论:

2$*应符合第二个参数,而1$d应与第一位的,但事实证明,这不是在printf("%2$*1$d", width, num);的情况属实。

如上所述已经,标准清晰附着的n$份作为%*后缀改性剂,而不是格式转换说明作为前缀改性剂(在本例d)和*。你的假定设计可能可以起作用,但不是选择的设计。

+0

不错的地方,我把它解释为'n $ *'和'%n $'。 – 2011-06-12 15:01:26

+0

+1比我的回答更清晰。 – 2011-06-12 15:34:08

+0

+1我的天啊,我不知道这件事! – phoxis 2011-06-12 16:23:01

3

在您的第二个例子:

printf("%2$*1$d", width, num); 

的第一个数字,如图2所示,附连到格式说明,而第二个数字,1,附接至*。如果您阅读printf的文档,这很清楚。没有不寻常的事情发生

1

甲字段宽度或精度,或两者,可以用星号 “*”或星号后面跟着一个或多个十进制数字和'$” 代替数字串来指示。

所以1$适用于星号,因此第一个参数是宽度。 2$适用于整个格式规范,因此第二个参数是要打印的值。

相关问题