In che modo printf e co distinguono tra float e double

In che modo printf e co distinguono tra float e double


Dal momento che non è fortemente digitato, ho pensato che avesse scelto la giusta dimensione di memoria e l'avesse interpretata in base al tipo di argomento. Ma float e double usano entrambi %f e hanno dimensioni diverse.


P.S.
Posso vedere come potrebbe funzionare la promozione tramite la copia del valore su un temporaneo e il casting (è corretto?)
ma come funziona per scanfs/sscanf?


Risposte:


Non si differenzia. Non è possibile ricevere un float come vararg:qualsiasi float l'argomento che fornisci viene prima promosso a double .


6.5.2.2/6 definisce le "promozioni di argomenti predefiniti" e /7 afferma che le promozioni di argomenti predefinite vengono applicate agli "argomenti finali", ovvero varargs denotato da ... .



Il %f formato per scanf richiede un puntatore a float . %lf richiede un puntatore a double , %Lf richiede un puntatore a long double .



Se fornisci un argomento float, l'implementazione crea un temporaneo di tipo double, lo inizializza con il valore float e lo passa come vararg. Il casting per definizione è esplicito conversione mediante l'uso dell'operatore cast -- puoi trasmettere se lo desideri per rendere esattamente chiaro al lettore cosa sta succedendo, ma float f = 3; printf("%f", f); è esattamente lo stesso di float f = 3; printf("%f", (double)f); . La promozione dell'argomento predefinito ha lo stesso significato del cast.