printf spécifie une chaîne de format entier pour float

#include  int main() { float a = 5; printf("%d", a); return 0; } 

Cela donne la sortie:

 0 

Pourquoi la sortie est-elle zéro?

Il n’imprime pas 5 car le compilateur ne sait pas convertir automatiquement en un entier. Vous devez faire (int)a vous (int)a même.

C’est-à-dire,

 #include void main() { float a=5; printf("%d",(int)a); } 

affiche correctement 5.

Comparez ce programme avec

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

où le compilateur sait directement print_int le float en int, en raison de la déclaration de print_int .

%d spécificateur de format %d ne peut être utilisé qu’avec des valeurs de type int . Vous passez un double (auquel float sera converti implicitement). Le comportement résultant est indéfini. Il n’y a pas de réponse à “pourquoi il affiche 0?” question. Tout peut être imprimé. En fait, tout peut arriver.

PS

  1. C’est int main , pas void main .
  2. Il n’y a pas d’en-tête tel que conio.h dans la norme C.

Vous devriez soit le convertir en int pour utiliser% d, ou utiliser une chaîne de format pour afficher le float sans précision décimale:

 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 } 

Vous devez utiliser %f au lieu de %d%d ne concerne que les entiers, tandis que %f correspond à la virgule flottante:

 #include #include void main() { float a=5; printf("%f",a); } 

Vous devez utiliser une autre chaîne de mise en forme. Il suffit de consulter http://www.cplusplus.com/reference/clibrary/cstdio/printf/

printf (“% f”, a);

Vous voudrez utiliser% f pour imprimer une valeur flottante.

par exemple

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

Comme d’autres personnes l’ont dit, vous devez utiliser %f dans la chaîne de format ou convertir a en int.

Mais je tiens à souligner que votre compilateur connaît probablement la chaîne de formatage de printf() et peut vous dire que vous l’utilisez mal. Mon compilateur, avec l’invocation appropriée ( -Wformat inclut -Wformat ), dit ceci:

 $ /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, et encore une chose: vous devez inclure ‘\ n’ dans printf() pour vous assurer que la sortie est envoyée au périphérique de sortie.

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

ou utilisez fflush(stdout); après le printf() .