Учитывая стандарт 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Спецификатор ion применяется к аргументу с указателем типа long long.
12 Спецификаторами преобразования и их значениями являются: a, e, f, g Соответствует необязательному знаку с плавающей запятой,(...)
14 Спецификаторы преобразования A, E, F, G и X также действительны и ведут себя так же, как, соответственно, a, e, f, g,и x.
Короче говоря, для fprintf
указаны следующие спецификаторы и соответствующие типы:
%f
-> double %Lf
-> long double.
и для fscanf
это:
%f
-> float %lf
-> двойной %Lf
-> длинный двойной.