#include <stdio.h>
int main()
{
float a = 5;
printf("%d", a);
return 0;
}
Esto le da a la salida:printf especifica cadena de formato de número entero de flotación
0
¿Por qué la salida de cero?
#include <stdio.h>
int main()
{
float a = 5;
printf("%d", a);
return 0;
}
Esto le da a la salida:printf especifica cadena de formato de número entero de flotación
0
¿Por qué la salida de cero?
usted tiene que utilizar una cadena de formato diferente, sólo echar un vistazo a http://www.cplusplus.com/reference/clibrary/cstdio/printf/
printf ("% f", a);
No imprime 5 porque el compilador no sabe convertir automáticamente a un número entero. Necesita hacer (int)a
usted mismo.
Es decir,
#include<stdio.h>
void main()
{
float a=5;
printf("%d",(int)a);
}
salidas correctamente 5.
comparar ese programa con
#include<stdio.h>
void print_int(int x)
{
printf("%d\n", x);
}
void main()
{
float a=5;
print_int(a);
}
donde el compilador sabe directamente a emitir el flotador a un int, debido a las la declaración de print_int
.
Específicamente, no se sabe convertir automáticamente a un número entero en una función variadica, pero eso es bastante difícil de explicar al principiante, sobre todo porque parece que el compilador de C debería conocer los tipos involucrados. –
Además de la variadicidad, saber qué tipo de conversión requeriría el compilador para analizar la cadena pasada a printf y deducir qué tipo se supone que es. GCC puede manejar fácilmente un constante "% d \ n" y avisarle cuando pase '-Wall', ¡pero mucha suerte cuando la cadena no está codificada en el programa! –
@MarkRushakoff Los programadores razonables no usan cadenas de formato no constantes, ya que presentan un problema de seguridad. –
%d
El especificador de formato solo se puede usar con valores del tipo int
. Está pasando un double
(que se convertirá implícitamente en float
). El comportamiento resultante no está definido. No hay respuesta a "¿por qué imprime 0?" pregunta. Cualquier cosa puede ser impresa. De hecho, cualquier cosa puede suceder.
P.S.
int main
, no void main
.conio.h
en la norma C.+1 para señalar que printf() tiene un doble. Arreglé el código para eliminar el '#include
Usted querrá utilizar% f para imprimir un valor flotante.
por ejemplo
float a=5;
printf("%f",a);
Usted debe convertirlo a un int usar% d, o utilizar una cadena de formato para mostrar el flotador sin precisión decimal:
void main() {
float a=5;
printf("%d",(int)a); // This casts to int, which will make this work
printf("%.0f",a); // This displays with no decimal precision
}
Es necesario utilizar %f
en lugar de %d
-%d
es sólo para los números enteros, mientras que %f
es de punto flotante:
Como dijeron las demás personas, debe usar %f
en la cadena de formato o convertir a
en un int.
Pero quiero señalar que su compilador, probablemente, conoce la cadena de formato printf()
y puede decirle que lo está utilizando incorrectamente.Mi compilador, con la invocación apropiada (-Wall
incluye -Wformat
), dice lo siguiente:
$ /usr/bin/gcc -Wformat tmp.c
tmp.c: In function ‘main’:
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
$ /usr/bin/gcc -Wall tmp.c
tmp.c: In function ‘main’:
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
$
Ah, y una cosa más: usted debe incluir '\ n' en el printf()
para garantizar la potencia se envía al dispositivo de salida .
printf("%d\n", a);
/* ^^ */
o utilizar fflush(stdout);
después de la printf()
.
Usa el formato del código. – Ree
'#include' eliminado porque no es necesario - otras limpiezas también. –