(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). Этот $
, вместе с предыдущим целым числом определяет индекс аргумента ширины.