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 fprintf
funçã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 fprintf
solicitar printf
, sprintf
e funções similares.
7.19.6.2 A fscanf
funçã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 fprintf
os seguintes especificadores e tipos correspondentes são especificados:
%f
-> duplo
%Lf
-> long double.
e por fscanf
isso é:
%f
-> flutuar
%lf
-> duplo
%Lf
-> long double.
"%lf"
é indefinido; nas bibliotecas C99 e C11, é definido como o mesmo que"%f"
.