Dado o padrão C99 (ou seja, o rascunho N1256 ), as regras dependem do tipo de função: fprintf (printf, sprintf, ...) ou scanf.
Aqui estão as partes relevantes extraídas:
Prefácio
Esta segunda edição cancela e substitui a primeira edição, ISO / IEC 9899: 1990, conforme alterada e corrigida pela ISO / IEC 9899 / COR1: 1994, ISO / IEC 9899 / AMD1: 1995 e ISO / IEC 9899 / COR2: 1996. As principais mudanças da edição anterior incluem:
%lf especificador de conversão permitido em printf
7.19.6.1 A fprintffunção
7 Os modificadores de comprimento e seus significados são:
l (ell) Especifica que (...) não tem efeito no seguinte especificador de conversão a, A, e, E, f, F, g ou G.
L Especifica que o seguinte especificador de conversão a, A, e, E, f, F, g ou G se aplica a um longo argumento duplo.
As mesmas regras especificadas para fprintfsolicitar printf, sprintfe funções similares.
7.19.6.2 A fscanffunção
11 Os modificadores de comprimento e seus significados são:
l (ell) Especifica que (...) o seguinte especificador de conversão a, A, e, E, f, F, g ou G se aplica a um argumento com o tipo ponteiro para duplo;
L Especifica que o seguinte especificador de conversão a, A, e, E, f, F, g ou G se aplica a um argumento com o ponteiro de tipo para long double.
12 Os especificadores de conversão e seus significados são: a, e, f, g Corresponde a um número de ponto flutuante opcionalmente assinado, (...)
14 Os especificadores de conversão A, E, F, G e X também são válidos e se comportam da mesma forma que, respectivamente, a, e, f, g e x.
A história longa, para fprintfos seguintes especificadores e tipos correspondentes são especificados:
%f -> duplo
%Lf -> long double.
e por fscanfisso é:
%f -> flutuar
%lf -> duplo
%Lf -> long double.
"%lf"é indefinido; nas bibliotecas C99 e C11, é definido como o mesmo que"%f".