problème avec la fonction printf?

j’ai écrit le programme suivant

#include  main() { int i = 2; float c = 4.5; printf("%d\n",c); printf("%f\n",i); return 0; } 

bien que je sache que c’est la mauvaise pratique, quand j’exécute le programme, j’ai eu la réponse

 0 4.500000 

mais quand j’ai échangé un peu les déclarations printf de cette façon

 #include  main() { int i = 2; float c = 4.5; printf("%f\n",i); printf("%d\n",c); return 0; } 

la sortie était

 0.000000 0 

Je ne pouvais pas comprendre ce qui se passait, personne ne m’expliquerait.

printf ne convertit pas ses arguments. Il regarde la mémoire contenant un float et l’imprime comme s’il s’agissait d’un entier – c’est comme prendre un fichier MP3 et demander à Word de l’ouvrir comme s’il s’agissait d’un document.

Un nombre à virgule flottante est stocké de manière complètement différente en mémoire sous forme d’entier – il ne s’agit pas simplement d’un nombre entier avec quelques points décimaux.

L’utilisation de descripteurs de format incorrects entraîne un comportement non défini .
Comportement non défini signifie que le comportement ne peut pas être expliqué. Cela pourrait fonctionner, ou ne pas donner des résultats imprévisibles, ce comportement peut varier de toute façon, il ne peut pas être expliqué de manière concluante et portable pour tous les compilateurs.

Fondamentalement, l’espace réservé au format est une instruction à la fonction sur la façon de récupérer et d’interpréter le bloc de mémoire suivant à partir de la liste d’arguments de longueur variable. Il s’attend à ce que le format corresponde exactement à ce que vous lui dites. Lorsque vous récupérez de la mémoire de manière inattendue, vous pouvez provoquer toutes sortes de problèmes et de comportements non définis. C’est pourquoi printf et ses semblables sont exploitables.

un entier et un float ont une représentation interne différente, vous ne devez donc pas confondre printf %f avec %d pour éviter des résultats imprévisibles. Les gens utilisent C spécialement parce que C est rapide, et c’est rapide simplement parce que cela laisse tout sous la responsabilité du programmeur. Donc, ne vous attendez pas à ce que printf fasse des conversions magiques sous le capot, car elles ne le feront tout simplement pas.

Fondamentalement, les contrôles de format remplacent l’espace réservé en fonction du type de données spécifié.

  • %d attend un argument de type int
  • %f attend un argument de type double

Donc, bonne façon de faire est

 #include  int main(){ int i = 2; float c = 4.5; printf("%d\n",i); printf("%f\n",c); return 0; }