Es liest aus der stdin-Variablen ‘var’ und druckt dann zweimal in stdout ‘var’. Ich verstehe, dass Sie so eine doppelte Variable von stdin lesen, aber meine Fragen sind:
Warum kann man mit %lf ein Double drucken?
Warum kann man mit %f ein Double drucken?
Welches ist besser und richtig zu verwenden?
Im printf Sie sind gleich.
– Marun
13. November 2013 um 11:15 Uhr
scanf nimmt Hinweise, die nicht befördert werden können, aber printf nimmt Werte, die können. in Bezug auf den Druck würde ich wahrscheinlich verwenden %lf da es für jeden, der Ihren Code liest, klarer ist.
– robbie_c
13. November 2013 um 11:16 Uhr
Mögliches Duplikat von Warum benötigt scanf() “%lf” für Doubles, wenn printf() nur mit “%f” in Ordnung ist?
– phuklv
9. September 2018 um 4:34 Uhr
Yu Hao
Für Funktionen mit variablen Argumenten wie printf und scanfwerden die Argumente heraufgestuft, z. B. werden alle kleineren ganzzahligen Typen heraufgestuft int, float befördert wird double.
scanf nimmt Parameter von Zeigern, sodass die Heraufstufungsregel keine Wirkung hat. Es muss verwendet werden %f zum float* und %lf zum double*.
printf werde niemals einen sehen float Streit, float wird immer befördert double. Der Formatbezeichner ist %f. Aber C99 sagt auch %lf ist das gleiche wie %f in printf:
C99 §7.19.6.1 Die fprintf Funktion
l (ell) Gibt an, dass eine folgende d, i, o, u, xoder X Konvertierungsspezifizierer gilt für a long int oder unsigned long int Streit; dass ein Gefolge n Konvertierungsbezeichner gilt für einen Zeiger auf a long int Streit; dass ein Gefolge c Konvertierungsspezifizierer gilt für a wint_t Streit; dass ein Gefolge s Konvertierungsbezeichner gilt für einen Zeiger auf a wchar_t Streit; oder hat keine Auswirkung auf ein Folgen a, A, e, E, f, F, goder G Konvertierungsbezeichner.
Wenn ein float übergeben wird printfwird es automatisch in a umgewandelt double. Dies ist Teil der Standardargument-Promotionsdie für Funktionen gelten, die eine variable Parameterliste (mit ...), vor allem aus historischen Gründen. Daher ist der „natürliche“ Spezifizierer für a float, %fmuss mit a arbeiten double Streit. Also die %f und %lf Spezifizierer für printf sind gleich; sie nehmen beide a double Wert.
Wann scanf aufgerufen wird, werden Zeiger übergeben, keine direkten Werte. Ein Hinweis auf float wird nicht in einen Zeiger auf umgewandelt double (Dies könnte nicht funktionieren, da sich das Objekt, auf das gezeigt wird, nicht ändern kann, wenn Sie den Zeigertyp ändern). So für scanfdas Argument für %f muss ein Hinweis darauf sein floatund das Argument für %lf muss ein Hinweis darauf sein double.
Soweit ich Handbuchseiten gelesen habe, sagt scanf, dass der Längenmodifikator „l“ (im Fall von Gleitkommazahlen) angibt, dass das Argument vom Typ double und nicht vom Typ float ist, sodass Sie „lf, le, lg“ haben können.
Was das Drucken betrifft, sagt das Handbuch offiziell, dass ‘l’ nur für Integer-Typen gilt. Daher wird es möglicherweise auf einigen Systemen oder von einigen Standards nicht unterstützt. Zum Beispiel erhalte ich beim Kompilieren mit die folgende Fehlermeldung gcc -Wall -Wextra -pedantic
a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]
Sie sollten also überprüfen, ob Ihr Standard die Syntax unterstützt.
Abschließend würde ich sagen, dass Sie mit ‘%lf’ lesen und mit ‘%f’ drucken.
Wenn man die C99- und C11-Spezifikation als “offiziell” verwendet, heißt es: “l … hat keine Auswirkung auf einen folgenden a-, A-, e-, E-, f-, F-, g- oder G-Konvertierungsspezifizierer.”.
– chux – Wiedereinsetzung von Monica
13. November 2013 um 13:27 Uhr
Was ist „das Handbuch“? Dies ist keine nützliche Referenz ohne Titel und Version. Außerdem ist das aktuelle Jahr 2013, daher sollte davon abgeraten werden, Softwarespezifikationen von 1990 zu verwenden, wenn modernere Versionen verfügbar sind.
Im
printf
Sie sind gleich.– Marun
13. November 2013 um 11:15 Uhr
scanf
nimmt Hinweise, die nicht befördert werden können, aberprintf
nimmt Werte, die können. in Bezug auf den Druck würde ich wahrscheinlich verwenden%lf
da es für jeden, der Ihren Code liest, klarer ist.– robbie_c
13. November 2013 um 11:16 Uhr
Mögliches Duplikat von Warum benötigt scanf() “%lf” für Doubles, wenn printf() nur mit “%f” in Ordnung ist?
– phuklv
9. September 2018 um 4:34 Uhr