Poprawny specyfikator formatu dla double w printf

Jaki jest poprawny specyfikator formatu dla double w printf? Czy jest to %f czy %lf? Wierzę, że to'jest %f, ale nie jestem pewien.

Próbka kodu

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
Rozwiązanie

"%f" jest (lub przynajmniej jednym) poprawnym formatem dla double. Nie ma* formatu dla float, ponieważ jeśli próbujesz przekazać float do printf, to'zostanie on awansowany do double zanim printf go otrzyma1. "%lf" jest również akceptowalne w obecnym standardzie -- l jest określone jako nie mające żadnego efektu, jeśli następuje po nim specyfikator konwersji f (między innymi).

Zauważ, że jest to jedno miejsce, w którym łańcuchy formatu printf różnią się znacząco od łańcuchów formatu scanf (i fscanf, itd.). Na wyjściu przekazujesz wartość, która zostanie zmieniona z float na double, gdy zostanie przekazana jako parametr variadic. Na wejściu przekazujesz pointer, który nie jest promowany, więc musisz powiedzieć scanf czy chcesz odczytać float czy double, więc dla scanf, %f oznacza, że chcesz odczytać float a %lf oznacza, że chcesz odczytać double (i dla tego co jest warte, dla long double, używasz %Lf dla printf lub scanf).


  1. C99, &#167 6.5.2.2/6: "Jeśli wyrażenie określające wywoływaną funkcję ma typ, który nie zawiera prototypu, promocje integer są wykonywane na każdym argumencie, a argumenty, które mają typ float są promowane do double. Nazywamy to domyślnymi promocjami argumentów." W C++ sformułowanie jest nieco inne (np. nie używa się słowa "prototyp"), ale efekt jest taki sam: wszystkie parametry zmiennopozycyjne przechodzą domyślne promocje zanim zostaną odebrane przez funkcję.
Komentarze (6)

Może to być %f, %g lub %e, w zależności od tego, jak chcesz, by liczba była sformatowana. Zobacz tutaj po więcej szczegółów. Modyfikator l jest wymagany w scanf z double, ale nie w printf.

Komentarze (2)

%Lf (zauważ dużą literę L) jest specyfikatorem formatu dla długich liczb podwójnych.

Dla zwykłego dwukrotnego, albo %e, %E, %f, %g lub %G.

Komentarze (3)