Le problème est que je ne peux pas comprendre à quel point l'ordinateur a compris que 3 et 3,0 sont les mêmes à la toute première place.
Je pense quet serait implicitement converti en flottant? P>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=3;
float b=3.0;
if(a==b)
printf("s");
else
printf("w");
return 0;
}
3 Réponses :
Dans cette expression Il est utilisé les conversions arithmétiques habituelles pour déterminer le type commun des opérandes. En conséquence, l'objet entier à partir de la norme C (6.5.9 opérateurs d'égalité) P > 4 Si les deux opérandes ont un type arithmétique, l'arithmétique habituel
Les conversions sont effectuées ... p>
blockQuote> p> A code> est converti au type flottant float code>. P>
Vous êtes correct que du point de vue de l'ordinateur (ou plutôt des implémentations de Une remarque à votre exemple: test d'égalité avec int code> est implicitement converti en float code> dans ce cas. En règle générale, lorsqu'une opération relationnelle ou binaire est faite en C qui nécessitent des types courants, les opérandes subissent une conversion implicite selon un ensemble de règles, voir Détails ici . p>
C code>) Il s'agit de garder les choses simples. Considérez l'opérateur d'égalité == code>. Cela doit être défini pour chaque combinaison possible de types d'opérandes à gauche et à droite. Si nous (par exemple) disposer de 10 types de données différents, l'opérateur == code> doit être implémenté dans 10 * 10 = 100 variantes pour supporter toutes les combinaisons. Conversion des types de données afin que les opérandes ont toujours le même type réduisent les variantes de l'opérateur code> == code> à 10. p>
float code> ou double code> est normalement évité, car l'ordinateur n'a pas d'infinité de précision et d'arrondi peut provoquer des nombres de points flottants qui devraient être égaux légèrement différent. p>
Dans le cas des chiffres, de toute façon, l'opérateur d'égalité L'entier De même, sur une machine ASCII, la valeur du caractère == code> ne signifie pas "sont ces deux choses identiques à toutes les manières?" Ce que cela signifie, c'est que "ces deux choses ont-elles la même valeur?" P>
3 code> et le numéro de point flottant 3.0 code> ont clairement la même valeur, donc si (3 == 3.0) code> est vrai . p>
'A' code> est 65, donc si ('a' == 65) code> est vrai, même si La lettre A et le numéro 65 pourraient ressembler à des choses très différentes au début. P>
Vous devriez certainement lire Cet article .
... et aussi Cet article .
Dans quel modèle mental ne seraient-ils pas égaux?
Contrairement à d'autres valeurs, Point flottant
3.0 code> peut être exactement i> représenté parfloat code> etdouble code> (le code utilise les deux) . La comparaison est donc vraie, peu importe quel type est converti à l'autre.Par curiosité, quel est votre raisonnement pour ne pas s'attendre à ce qu'ils soient égaux?
Dans une langue fortement dactylographiée, il serait illégal de les comparer du tout sans une coercition de type explicite. Dans une langue plus faiblement dactylographiée, l'entier serait converti et comparer égal à dans les limites du type à flotteur. Je ne connais aucune langue dans laquelle la comparaison serait autorisée et toujours fausse.