Qual è la differenza tra %f e %lf in C?

Qual è la differenza tra %f e %lf in C?

Per scanf , %f legge in un float e %lf legge in un double .

Per printf :In C99 e versioni successive, sono entrambi identici e stampano un float o un double . In C89, %lf ha causato un comportamento indefinito sebbene fosse un'estensione comune per trattarlo come %f .

Il motivo per cui uno specificatore può essere utilizzato per due tipi diversi in printf è dovuto alle promozioni di argomenti predefiniti; argomenti di tipo float sono promossi a double quando viene utilizzato per chiamare una funzione e non corrisponde a un parametro in un prototipo di funzione. Quindi printf vede solo un double in entrambi i casi.


La risposta breve è che non ha alcun impatto su printf e denota l'uso di float o double in scanf .

Per printf , argomenti di tipo float sono promossi a double quindi entrambi %f e %lf sono usati per double . Per scanf , dovresti usare %f per float e %lf per double .

Maggiori dettagli per gli avvocati linguistici tra noi di seguito:

Non c'è differenza tra %f e %lf nel printf famiglia. Lo standard ISO C (tutti i riferimenti all'interno provengono da C11), sezione 7.21.6.1 The fprintf function , paragrafo /7 afferma, per il l modificatore (corsivo mio):

Il motivo per cui non è necessario modificare il f specificatore è perché quello specificatore già denota un double , dal paragrafo /8 di quella stessa sezione dove elenca il tipo per il %f specificatore:

Ciò ha a che fare con il fatto che gli argomenti che seguono l'ellisse nel prototipo della funzione sono soggetti a promozioni di argomenti predefinite come da sezione 6.5.2.2 Function calls , paragrafo /7 :

Dal printf (e l'intera famiglia di printf -like functions) è dichiarato come int printf(const char * restrict format, ...); con la notazione dei puntini di sospensione, questa regola si applica qui. Le promozioni degli argomenti predefiniti sono trattate nella sezione 6.5.2.2 Function calls , paragrafo /6 :

Per il scanf famiglia, impone l'uso di un double piuttosto che un float . Sezione 7.21.6.2 The fscanf function /11 :

Questo modifica il /12 paragrafo di quella sezione che afferma, per %f :


Il modificatore di larghezza in %lf viene ignorato con garbo da printf(). Oppure, per essere più precisi, %f prende un double - varargs promuoverà sempre gli argomenti float a double.