Puis-je supposer (bool)true == (int)1 pour tout compilateur C++?
puis-je supposer (bool)true == (int)1
pour n'importe quel compilateur C++?
5 réponses
Oui. Les moulages sont redondants. Dans votre expression:
true == 1
La promotion intégrale s'applique et la valeur de bool sera promue à un int
et cette promotion doit donner 1.
référence: 4.7 [conv.intégrale] / 4: si le type de source est bool
... true
est converti en un.
la réponse de Charles Bailey est correcte. La formulation exacte de la norme c++ est (§4.7 / 4): "si le type de source est bool, la valeur false est convertie à zéro et la valeur true est convertie à un."
Modifier: je vois qu'il a ajouté la référence aussi bien -- je vais supprimer cela sous peu, si Je ne me laisse pas distraire et oublier...
Edit2: encore une fois, il est probablement intéressant de noter que tandis que les valeurs booléennes elles-mêmes convertissent toujours à zéro ou un, un certain nombre de fonctions (en particulier de la bibliothèque standard C) renvoient des valeurs qui sont "essentiellement booléennes", mais représentées par int
s qui ne doivent normalement être nulles que pour indiquer false ou non-zero pour indiquer true. Par exemple, les fonctions is* de <ctype.h>
ne requièrent que zéro ou non-zéro, pas nécessairement zéro ou un.
si vous lancez ça sur bool
, Zéro se convertira en faux, et non-zéro en vrai (comme vous vous y attendiez).
selon la norme, vous devriez être en sécurité avec cette hypothèse. Le type C++ bool
a deux valeurs - true
et false
avec les valeurs correspondantes 1 et 0.
la chose à surveiller est de mélanger bool
expressions et variables avec BOOL
expression et variables. Ce dernier est défini comme FALSE = 0
et TRUE != FALSE
, ce qui signifie très souvent dans la pratique que toute valeur différente de 0 est considérée TRUE
.
beaucoup de compilateurs modernes émettront en fait un avertissement pour tout code qui tente implicitement de lancer de BOOL
à bool
si la valeur BOOL
est différente de 0 ou 1.
j'ai trouvé différents compilateurs retourner différents résultats sur true. J'ai trouvé aussi que l'on est presque toujours préférable de comparer un bool bool au lieu d'un int. Ces ints ont tendance à changer de valeur au fil du temps au fur et à mesure que votre programme évolue et si vous supposez que true as 1, vous pouvez vous faire mordre par un changement non lié ailleurs dans votre code.
Non, TRUE peut être arbitraire parmi les compilateurs. Certains utiliseront 1, certains -1 (tous les bits set, signé var), d'autres compilateurs peut utiliser une valeur différente. Même si la valeur est normalisée, tous les compilateurs ne peuvent pas suivre la norme.
FAUX, cependant, c'est lorsque tous les bits sont claires, ce qui ne se produit que pour la valeur numérique 0.