2009-10-27 28 views

Respuesta

13

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.

+0

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. –

+1

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! –

+0

@MarkRushakoff Los programadores razonables no usan cadenas de formato no constantes, ya que presentan un problema de seguridad. –

12

%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.

  1. Eso es int main, no void main.
  2. No hay encabezado como conio.h en la norma C.
+1

+1 para señalar que printf() tiene un doble. Arreglé el código para eliminar el '#include ' superfluo e irrelevante. –

4

Usted querrá utilizar% f para imprimir un valor flotante.

por ejemplo

float a=5; 
printf("%f",a); 
5

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 
} 
5

Es necesario utilizar %f en lugar de %d-%d es sólo para los números enteros, mientras que %f es de punto flotante:

1

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().

Cuestiones relacionadas