¿Por qué scanf () necesita "% lf" para los dobles, cuando printf () está bien con solo "% f"?

StackOverflow https://stackoverflow.com/questions/210590

  •  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);
¿Fue útil?

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 para float
  • % lf para double
  • % Lf para long 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top