¿Por qué scanf () necesita "% lf" para los dobles, cuando printf () está bien con solo "% f"?
-
03-07-2019 - |
Pregunta
¿Por qué es que scanf ()
necesita el l
en " % lf
" al leer un double
, cuando printf ()
puede usar " % f
" independientemente de si su argumento es un double
o un float
?
Código de ejemplo:
double d;
scanf("%lf", &d);
printf("%f", d);
Solución
Porque C promoverá flotantes a dobles para funciones que toman argumentos variables. Los punteros no se promocionan a nada, por lo que debe usar % lf
, % lg
o % le
(o % la
en C99) para leer en dobles.
Otros consejos
Desde ?99, la coincidencia entre los especificadores de formato y los tipos de argumento de coma flotante en C es coherente entre printf
y scanf
. Es
-
% f
parafloat
-
% lf
paradouble
-
% Lf
paralong double
Sucede que cuando los argumentos de tipo float
se pasan como parámetros variables, dichos argumentos se convierten implícitamente a tipo double
. Esta es la razón por la cual en el formato printf
los especificadores % f
y % lf
son equivalentes e intercambiables. En printf
puede " uso cruzado " % lf
con float
o % f
con double
.
Pero no hay razón para hacerlo en la práctica. No utilice % f
para printf
argumentos de tipo double
. Es un hábito generalizado nacido en C89/90 veces, pero es un mal hábito. Utilice % lf
en printf
para double
y mantenga % f
reservado para los argumentos float
.
scanf
necesita saber el tamaño de los datos señalados por & amp; d
para llenarlo correctamente, mientras que las funciones variadas promueven flotantes a dobles (no del todo seguro por qué ), por lo que printf
siempre obtiene un double
.
Porque, de lo contrario, scanf pensará que está pasando un puntero a un flotante que tiene un tamaño menor que un doble, y devolverá un valor incorrecto.
El uso de un valor flotante o doble en una expresión en C dará como resultado un valor doble de todos modos, por lo que printf no puede notar la diferencia. Mientras que un puntero a un doble tiene que ser señalado explícitamente para scanf a diferencia de un puntero para flotar, porque lo que apunta el puntero es lo que importa.