2011-06-18 28 views
37

Dado que no está fuertemente tipado, pensé que simplemente escogió el tamaño correcto de la memoria y lo interpretó en función del tipo de argumento. Pero flotante y doble usan% f y son de diferentes tamaños.¿Cómo se diferencia printf y co entre float y double?

P.S. Puedo ver cómo la promoción mediante la copia del valor a una temperatura y fundición (¿es esto correcto?) Podría funcionar , pero ¿cómo funciona para scanfs/sscanf?

+0

[¿Por qué printf() promociona un flotador a un doble?] (Http://stackoverflow.com/q/28097564/995714) –

Respuesta

55

No se diferencia. No es posible recibir un float como vararg: cualquier argumento float que proporcione se promociona primero al double.

6.5.2.2/6 define "promociones de argumento predeterminadas", y/7 establece que las promociones de argumento predeterminadas se aplican a "argumentos finales", es decir varargs denotados por ....

¿cómo funciona para scanfs/sscanf?

El formato %f para scanf requiere un puntero a float. %lf requiere un puntero a double, %Lf requiere un puntero a long double.

copiar el valor a una temperatura y fundición (es este derecho?)

Si proporciona un argumento float, a continuación, la aplicación crea un temporal de tipo double, lo inicializa con el valor del flotador, y pasa esto como el vararg. Por definición, el casting es explicita conversión mediante el operador de transmisión; puede transmitirlo si lo desea para que el lector sepa exactamente lo que está sucediendo, pero float f = 3; printf("%f", f); es exactamente lo mismo que float f = 3; printf("%f", (double)f);. La promoción del argumento predeterminado tiene el mismo significado que el elenco.

+0

¿Qué pasa con scanf? –

+0

Gracias, ¿los printfs (estándar o extensiones) aceptan eso por el doble de bien para mantener la simetría? –

+7

Ah, si quieres decir "puedo usar% lf y% Lf como formatos en' printf' y co ", entonces sí, puedes. % lf es exactamente lo mismo que% f, ambos toman un 'doble'. % Lf toma 'long double'. –

Cuestiones relacionadas