Учитывая стандарт 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".