Соответствующая часть спецификации POSIX printf()
определяет это поведение:
Преобразования могут применяться к n -ому аргументу после формата в списке аргументов, а не к следующему неиспользованному аргументу. В этом случае символ спецификатора преобразования% (см. Ниже) заменяется последовательностью "% n $", где n - это десятичное целое число в диапазоне [1, {NL_ARGMAX}], задающее позицию аргумента в списке аргументов. Эта функция обеспечивает определение строк формата, которые выбирают аргументы в порядке, соответствующем конкретным языкам (см. Раздел ПРИМЕРЫ).
Формат может содержать либо нумерованные спецификации преобразования аргументов (то есть "% n $" и "* m $"), либо ненумерованные спецификации преобразования аргументов (то есть% и *), но не оба. Единственным исключением является то, что %% можно смешивать с формой «% n $». Результаты смешивания нумерованных и ненумерованных спецификаций аргументов в строке формата не определены. Когда используются спецификации нумерованных аргументов, для указания N -ого аргумента необходимо, чтобы все ведущие аргументы, от первого до ( N-1 ) -го, были указаны в строке формата.
В строках формата, содержащих форму преобразования "% n $", нумерованные аргументы в списке аргументов могут ссылаться из строки формата столько раз, сколько требуется.
%n$
определяет аргумент, значение которого должно быть напечатано - аргумент 2 в вашем примере.
*n$
определяет аргумент, значение которого следует рассматривать как ширину формата - аргумент 1 в вашем примере.
Итак, те, кто писал руководство, следовали стандарту.
Вы утверждаете в комментарии:
2$*
должен соответствовать второму параметру, в то время как 1$d
должен соответствовать первому, но оказывается, что в случае printf("%2$*1$d", width, num);
.
это не так.
Как уже отмечалось, стандарт явно прикрепляет части n$
в качестве постфиксных модификаторов %
и *
, а не в качестве префиксных модификаторов спецификатора преобразования формата (d
в этом примере) и *
, Ваш предполагаемый дизайн, возможно, можно заставить работать, но он не был выбран.