2009-10-27 12 views

risposta

13

Non stampa 5 perché il compilatore non conosce il cast automatico su un numero intero. Devi fare da solo (int)a.

Vale a dire,

#include<stdio.h> 
void main() 
{ 
float a=5; 
printf("%d",(int)a); 
} 

correttamente uscite 5.

confrontare tale programma con

#include<stdio.h> 
void print_int(int x) 
{ 
printf("%d\n", x); 
} 
void main() 
{ 
float a=5; 
print_int(a); 
} 

cui il compilatore sa direttamente per lanciare il galleggiante a un int, a causa la dichiarazione di print_int.

+0

In particolare, non sa di eseguire automaticamente il cast su un numero intero in una funzione variadica, ma è piuttosto difficile da spiegare al principiante, soprattutto perché sembra che il compilatore C dovrebbe conoscere i tipi coinvolti. –

+1

Oltre alla variadicità, sapere quale tipo di cast richiederebbe al compilatore di analizzare la stringa passata a printf e dedurre quale tipo dovrebbe essere. GCC può facilmente gestire una costante "% d \ n" e avvisarti quando viene passato '-Wall', ma buona fortuna quando la stringa non è codificata nel programma! –

+0

@MarkRushakoff I programmatori ragionevoli non usano stringhe di formato non costante, poiché introducono un problema di sicurezza. –

12

%d identificatore di formato può essere utilizzato solo con valori di tipo int. Stai passando un double (che verrà convertito implicitamente in float). Il comportamento risultante non è definito. Non c'è una risposta a "perché stampa 0?" domanda. Tutto può essere stampato. In realtà, tutto può succedere.

P.S.

  1. Questo è int main, non void main.
  2. Non esiste un'intestazione come conio.h in serie C.
+1

+1 per indicare che printf() ha superato il doppio. Ho corretto il codice per rimuovere il superfluo e irrilevante '#include '. –

4

Ti consigliamo di utilizzare% f per la stampa di un valore float.

esempio

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

Si dovrebbe neanche cast ad un int di utilizzare% d, o utilizzare una stringa di formato per visualizzare il galleggiante senza precisione decimale:

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

È necessario utilizzare %f invece di %d-%d è solo per gli interi, mentre %f è per virgola mobile:

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    float a=5; 
    printf("%f",a); 
} 
012.
1

Come hanno detto le altre persone, è necessario utilizzare %f nella stringa di formato o convertire a in un file int.

Ma voglio sottolineare che il tuo compilatore, probabilmente, conosce la stringa di formato di printf() e può dirti che lo stai usando male.Il mio compilatore, con l'invocazione appropriata (-Wall include -Wformat), dice:

$ /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’ 

$ 

Oh, e un'altra cosa: si dovrebbe includere '\ n' nel printf() per garantire la potenza viene inviata al dispositivo di uscita .

printf("%d\n", a); 
/*  ^^ */ 

o utilizzare fflush(stdout); dopo la printf().

Problemi correlati