Warum funktioniert scanf () need „% lf“ für Doppelzimmer, wenn printf () ist in Ordnung mit nur „% f“?
-
03-07-2019 - |
Frage
Warum ist es, dass scanf()
die l
in „%lf
“ braucht, wenn ein double
lesen, wenn printf()
kann „%f
“, unabhängig davon verwenden, ob ihr Argument ist ein double
oder ein float
?
Beispielcode:
double d;
scanf("%lf", &d);
printf("%f", d);
Lösung
Da C schwimmt auf Doppel für Funktionen fördern, die variable Argumente. Zeiger sind nicht auf etwas gefördert, so sollten Sie %lf
, %lg
oder %le
(oder %la
in C99) im Doppel gelesen werden.
Andere Tipps
Da С99 die Anpassung zwischen Formatbezeich und Gleitkommazahlen Argumenttypen in C ist konsistent zwischen printf
und scanf
. Es ist
-
%f
fürfloat
-
%lf
fürdouble
-
%Lf
fürlong double
Es passiert einfach so, dass, wenn Argumente vom Typ float
als variadische Parameter übergeben werden, werden solche Argumente implizit eingeben double
umgewandelt. Dies ist der Grund, warum in printf
Formatbezeich %f
und %lf
sind gleichwertig und austauschbar. In printf
Sie können "cross-use" %lf
mit float
oder %f
mit double
.
Aber es gibt keinen Grund, eigentlich ist es in der Praxis zu tun. Verwenden Sie %f
nicht Argumente vom Typ printf
double
. Es ist eine weit verbreitete Gewohnheit in C89 geboren zurück / 90 mal, aber es ist eine schlechte Angewohnheit. Verwenden Sie %lf
in printf
für double
und halten %f
reserviert für float
Argumente.
scanf
muss die Größe der Daten kennen, zu von &d
hingewiesen wird, um es richtig zu füllen, während variadische Funktionen Schwimmern verdoppelt fördern (nicht ganz sicher, warum), so printf
ist immer eine double
bekommen.
Weil sonst Scanf denkt, dass Sie einen Zeiger auf einen Schwimmer sind vorbei, die eine kleinere Größe als ein doppelt so hoch ist, und es wird einen falschen Wert zurück.
entweder einen Schwimmer oder einen doppelten Wert in einem C-Ausdruck verwendet, wird in einem Wert zur Folge hat, dass ein Doppel sowieso, also printf nicht sagen, den Unterschied kann. Während ein Zeiger auf ein Doppel explizit signalisiert werden muss, im Unterschied scanf von einem Zeiger zu schweben, weil das, was der Zeiger zeigt auf, was wichtig ist.