(GCC) знак доллара в строке формата printf
Я видел следующую строку в исходном коде, написанном на C:
printf("%2$d %1$d", a, b);
что это значит?
2 ответов
Это расширение языка, добавленного 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 man pages.
в спецификации C C11dr 7.21.6.1
как часть формата печати, первый % на "%2$d %1$d" вводит директивы. Эта директива может иметь различные флаги, ширину, точность, модификатор длины и, наконец, спецификатор преобразования. В этом случае 2 - это ширина. Следующий персонаж $ ни точность, ни модификатор длины ни спецификатор преобразования. Таким образом, поскольку спецификация преобразования недопустима,
... поведение не определено. C11dr 7.21.6.1 9
спецификация C обсуждает будущие направления библиотеки. Строчные буквы могут быть добавлены в будущем, а другие символы могут использоваться в расширениях. Конечно!--3--> не является строчной буквой, так что это хорошо для будущего. Это, безусловно, соответствует роли "другого персонажа" как $ даже не является частью набора символов C.
в различных реализациях * nix,$ используется, как описано в руководство программиста Linux PRINTF (3). Этот $, вместе с предыдущим целым числом определяет индекс аргумента ширины.