Учитывая стандарт C99 (а именно, черновик N1256 ), правила зависят от вида функции: fprintf (printf, sprintf, ...) или scanf.
Вот соответствующие извлеченные части:
предисловие
Настоящее второе издание отменяет и заменяет первое издание, ISO / IEC 9899: 1990, с поправками и исправлениями, изложенными в ISO / IEC 9899 / COR1: 1994, ISO / IEC 9899 / AMD1: 1995 и ISO / IEC 9899 / COR2: 1996. Основные изменения по сравнению с предыдущим изданием:
%lf
спецификатор преобразования разрешен в printf
7.19.6.1 fprintf
Функция
7 Модификаторы длины и их значения:
l (ell) Указывает, что (...) не влияет на следующий спецификатор преобразования a, A, e, E, f, F, g или G.
L Указывает, что следующий спецификатор преобразования a, A, e, E, f, F, g или G применяется к длинному двойному аргументу.
fprintf
Применяются те же правила printf
, что sprintf
и для похожих функций.
7.19.6.2 fscanf
Функция
11 Модификаторы длины и их значения:
l (ell) Указывает, что (...) что следующий спецификатор преобразования a, A, e, E, f, F, g или G применяется к аргументу с указателем типа double;
L Указывает, что следующий аргумент преобразования a, A, e, E, f, F, g или G применяется к аргументу с указателем типа на long double.
12 Спецификаторы преобразования и их значения: a, e, f, g Соответствует необязательному знаку с плавающей запятой, (...)
14 Спецификаторы преобразования A, E, F, G и X также действительны и ведут себя так же, как, соответственно, a, e, f, g и x.
Короче говоря, для fprintf
следующих спецификаторов и соответствующих типов указаны:
%f
-> двойной
%Lf
-> длинный двойной.
и для fscanf
этого есть:
%f
-> плавать
%lf
-> двойной
%Lf
-> длинный двойной.
"%lf"
не определено; в библиотеках C99 и C11 он определен так же, как"%f"
.