#include <stdio.h>
int main()
{
float a = 5;
printf("%d", a);
return 0;
}
Questo dà l'output:printf specifica stringa di formato intero per float
0
Perché l'uscita zero?
#include <stdio.h>
int main()
{
float a = 5;
printf("%d", a);
return 0;
}
Questo dà l'output:printf specifica stringa di formato intero per float
0
Perché l'uscita zero?
è necessario utilizzare una stringa di formattazione diversa, basta dare un'occhiata alla http://www.cplusplus.com/reference/clibrary/cstdio/printf/
printf ("% f", a);
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
.
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. –
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! –
@MarkRushakoff I programmatori ragionevoli non usano stringhe di formato non costante, poiché introducono un problema di sicurezza. –
%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.
int main
, non void main
.conio.h
in serie C.+1 per indicare che printf() ha superato il doppio. Ho corretto il codice per rimuovere il superfluo e irrilevante '#include
Ti consigliamo di utilizzare% f per la stampa di un valore float.
esempio
float a=5;
printf("%f",a);
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
}
È 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.
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()
.
Usa la formattazione del codice. – Ree
'#include' rimosso perché non necessario - anche altre pulizie. –