scan c double printf stdout stdin

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:

  1. ¿Por qué puedes imprimir un doble con% lf?
  2. ¿Por qué puedes imprimir un doble con% f?
  3. ¿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ón d , i , o , u , x , o X aplica a un argumento unsigned long int o unsigned long int ; que un siguiente especificador de conversión se aplica a un puntero a un argumento long int ; que un especificador de conversión c siguiente se aplica a un argumento wint_t ; que el siguiente especificador de conversión s aplica a un puntero a un argumento wchar_t ; o no tiene efecto en los siguientes especificadores de conversión a , A , e , E , f , F , g o G