Pourquoi j’obtiens zéro dans les expressions float comme 1/2?

S’il vous plaît quelqu’un peut expliquer ce comportement

#include  int main(int argc, char **argv){ printf("%f", ( 1 / 2 ) ); return 0; } /* output : 0.00000 */ 

1 / 2 n’est pas une expression à virgule flottante.

 printf("%f", ( 1 / 2 ) ); 

Les parenthèses intérieures sont inutiles; c’est un peu plus facile à lire que:

 printf("%f", 1 / 2); 

Dans la plupart des cas, le type d’une expression en C est déterminé par l’expression elle-même et non par le contexte dans lequel elle apparaît. Cela s’applique même aux sous-expressions d’expressions plus grandes.

Les opérateurs arithmétiques + , - , * et / prennent toujours deux opérandes du même type numérique et produisent un résultat de ce type. Il existe des règles pour convertir les opérandes en un type commun, mais 1 et 2 sont tous deux de type int , nous n’avons donc pas à nous en préoccuper. Tous ces opérateurs, s’ils sont appelés avec des opérandes int , donnent un résultat int . La division entière est tronquée , en éliminant le rest 1 / 2 renvoie donc la valeur int 0 .

Donc, ce qui précède est équivalent à:

 printf("%f", 0); 

Le format "%f" nécessite un argument de type double ; 0 est de type int . Pour la plupart des fonctions, il y aurait une conversion implicite, mais les types des parameters sont déterminés par la chaîne de formatage, et non par la déclaration de fonction. Le compilateur ne sait donc pas quel type convertir. (Considérez que la chaîne de format n’a pas besoin d’être un littéral de chaîne.) Le passage d’un argument int avec un format "%f" a un comportement indéfini . Dans votre cas, il est juste arrivé d’imprimer 0 . Nous pourrions spéculer sur la façon dont cela s’est passé, mais cela n’a pas d’importance; vous devez corriger le code.

Si vous voulez imprimer cette valeur int , vous pouvez utiliser "%d" :

 printf("%d", 1 / 2); 

Mais vous voulez probablement 0.5 . Vous pouvez l’obtenir en utilisant des opérandes de type double :

 printf("%f", 1.0 / 2.0); 

(Vous pouvez changer seulement l’un des deux opérandes en une constante à virgule flottante, mais il est plus clair de changer les deux.)

Enfin, vous devriez imprimer une nouvelle ligne à la fin de votre sortie:

 printf("%f\n", 1.0 / 2.0); 

Exactement ce que quantdev a dit. Les personnes qui ont écrit le langage C ont pensé que “hé, disons simplement que le dividende de deux entiers est un entier, car les entiers sont super utiles et peut-être qu’obtenir un float dérangerait votre style lorsque vous essayez d’indexer un tableau “. Donc, le compilateur C lance le rest à la poubelle et il ne vous rest que 0.

1 / 2

Pour déclarer que vous voulez que votre sacré double (ou float), vous feriez mieux de transformer l’un des deux nombres de la division en float! Ainsi,

1 / 2.0

et, dans son contexte …

pas ce que tu veux:

printf("%f", ( 1 / 2 ) ); ,

ce que tu veux:

printf("%f", ( 1 / 2.0 ) ); ,