Wie unterscheiden printf und co zwischen Float und Double?

Wie unterscheiden printf und co zwischen Float und Double?


Da es nicht stark typisiert ist, dachte ich, es hat nur die richtige Speichergröße ausgewählt und basierend auf der Art des Arguments interpretiert. Aber float und double verwenden beide %f und haben unterschiedliche Größen.


P.S.
Ich kann sehen, wie die Beförderung durch Kopieren des Werts in einen temporären und Casting (ist das richtig?) funktionieren könnte
aber wie funktioniert es für scanfs/sscanf?


Antworten:


Es unterscheidet nicht. Es ist nicht möglich, einen float zu erhalten als vararg:irgendein float Das von Ihnen bereitgestellte Argument wird zuerst auf double heraufgestuft .


6.5.2.2/6 definiert „Standard-Argument-Promotions“ und /7 gibt an, dass Standard-Argument-Promotions auf „nachgestellte Argumente“ angewendet werden, d. h. auf Varargs, die durch ... gekennzeichnet sind .



Die %f Format für scanf erfordert einen Zeiger auf float . %lf erfordert einen Zeiger auf double , %Lf erfordert einen Zeiger auf long double .



Wenn Sie ein Float-Argument angeben, erstellt die Implementierung ein temporäres Objekt vom Typ Double, initialisiert es mit dem Float-Wert und übergibt diesen als vararg. Casting ist per Definition explizit Konvertierung durch Verwendung des Cast-Operators -- Sie können umwandeln, wenn Sie möchten, um dem Leser genau zu verdeutlichen, was los ist, aber float f = 3; printf("%f", f); ist genau dasselbe wie float f = 3; printf("%f", (double)f); . Das Standardargument Promotion hat die gleiche Bedeutung wie der Cast.