scan double c++
Scanf/Printf doble variable C (3)
Cuando se pasa un float
a printf
, se convierte automáticamente a double
. Esto es parte de las promociones de argumentos predeterminadas , que se aplican a las funciones que tienen una lista de parámetros variables (que contiene ...
), en gran parte por razones históricas. Por lo tanto, el especificador "natural" para un float
, %f
, debe funcionar con un argumento double
. Por lo tanto, los especificadores %f
y %lf
para printf
son los mismos; Ambos toman un double
valor.
Cuando se llama a scanf
, se pasan los punteros, no los valores directos. Un puntero a float
no se convierte en un puntero a double
(esto no podría funcionar ya que el objeto apuntado a no puede cambiar cuando cambia el tipo de puntero). Entonces, para scanf
, el argumento para %f
debe ser un puntero para float
, y el argumento para %lf
debe ser un puntero para double
.
Digamos que tengo este siguiente bit de código en C:
double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);
Lee de la variable estándar ''var'' y luego imprime dos veces en stdout ''var''. Entiendo que así es como lees una variable doble de stdin, pero mis preguntas son:
- ¿Por qué puedes imprimir un doble con% lf?
- ¿Por qué puedes imprimir un doble con% f?
- ¿Cuál es mejor y correcto de usar?
Hasta donde leo las páginas de manual, scanf dice que el modificador de longitud ''l'' indica (en caso de puntos flotantes) que el argumento es de tipo doble en lugar de tipo float, así que puede tener ''lf, le, lg''.
En cuanto a la impresión, oficialmente, el manual dice que ''l'' solo se aplica a tipos enteros. Por lo tanto, puede que no sea compatible con algunos sistemas o con algunos estándares. Por ejemplo, recibo el siguiente mensaje de error al compilar con gcc -Wall -Wextra -pedantic
a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]
Por lo tanto, es posible que desee volver a verificar si su estándar admite la sintaxis.
Para concluir, diría que usted lee con ''% lf'' e imprime con ''% f''.
Para funciones de argumento variable como printf
y scanf
, los argumentos se promueven, por ejemplo, cualquier tipo de entero más pequeño se promueve a int
, float
se promueve a double
.
scanf
toma parámetros de punteros, por lo que la regla de promoción no tiene efecto. Debe usar %f
para float*
y %lf
para double*
.
printf
nunca verá un argumento float
, float
siempre se promueve a double
. El especificador de formato es %f
. Pero C99 también dice que %lf
es lo mismo que %f
en printf
:
C99 §7.19.6.1 La función
fprintf
l
(ell) Especifica que un siguiente especificador de conversiónd
,i
,o
,u
,x
, oX
aplica a un argumentounsigned long int
ounsigned long int
; que un siguiente especificador de conversión se aplica a un puntero a un argumentolong int
; que un especificador de conversiónc
siguiente se aplica a un argumentowint_t
; que el siguiente especificador de conversións
aplica a un puntero a un argumentowchar_t
; o no tiene efecto en los siguientes especificadores de conversióna
,A
,e
,E
,f
,F
,g
oG