Specificatorul de format corect pentru double în printf

Care este specificatorul de format corect pentru double în printf? Este %f sau %lf? Cred că este %f, dar nu sunt sigur.

Code sample

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
Soluția

"%f" este formatul (sau cel puțin unul) corect pentru un dublu. Nu există niciun format pentru un float, deoarece dacă încercați să treceți un float la printf, acesta va fi promovat la double înainte ca printf să-l primească1. "%lf"`` este, de asemenea, acceptabil în conformitate cu standardul actual -- se specifică faptul călnu are niciun efect dacă este urmat de specificatorul de conversief` (printre altele).

Rețineți că acesta este un loc în care șirurile de format printf diferă substanțial de șirurile de format scanf (și fscanf, etc.). Pentru ieșire, treceți o valoare, care va fi promovată din float în double atunci când este trecută ca parametru variadic. Pentru intrare, treceți un pointer, care nu este promovat, așa că trebuie să îi spuneți lui scanf dacă doriți să citiți un float sau o double, astfel încât pentru scanf, %f înseamnă că doriți să citiți un float și %lf înseamnă că doriți să citiți o double (și, dacă mai contează, pentru un long double, folosiți %Lf fie pentru printf, fie pentru scanf).


  1. C99, §6.5.2.2.2/6: "Dacă expresia care denumește funcția apelată are un tip care nu include un prototip, promovările de numere întregi sunt efectuate pe fiecare argument, iar argumentele care au tipul float sunt promovate la double. Acestea se numesc promovări ale argumentelor implicite." În C++, formularea este oarecum diferită (de exemplu, nu se folosește cuvântul "prototip"), dar efectul este același: toți parametrii variadici sunt supuși promovărilor implicite înainte de a fi primiți de funcție.
Comentarii (6)

Acesta poate fi %f, %g sau %e, în funcție de modul în care doriți să formatați numărul. Consultați aici pentru mai multe detalii. Modificatorul l este necesar în scanf cu double, dar nu și în printf.

Comentarii (2)

%Lf (observați majuscula L) este specificatorul de format pentru long doubles.

Pentru double simple, este suficient %e, %E, %f, %g sau %G.

Comentarii (3)