Warum funktioniert scanf () need „% lf“ für Doppelzimmer, wenn printf () ist in Ordnung mit nur „% f“?

StackOverflow https://stackoverflow.com/questions/210590

  •  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);
War es hilfreich?

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ür float
  • %lf für double
  • %Lf für long 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top