Puis-je supposer (bool)true == (int)1
pour tout compilateur C++?
Oui. Les moulages sont redondants. Dans ton expression:
true == 1
La promotion intégrale s'applique et la valeur booléenne sera promue à un int
et cette promotion doit rapporter 1.
Référence: 4.7 [conv.integral]/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 la suivante (§4.7/4): "Si le type de source est bool, la valeur false est convertie en zéro et la valeur true en un."
Edit: Je vois qu’il a également ajouté la référence - je l’effacerai sous peu, si je ne me laisse pas distraire et que j’oublie ...
Edit2: Là encore, il est probablement intéressant de noter que, bien que les valeurs booléennes elles-mêmes soient toujours converties en zéro ou un, plusieurs fonctions (en particulier de la bibliothèque standard C) renvoient des valeurs "essentiellement booléennes", mais représentées par int
s qui normalement ne doivent être que zéro pour indiquer faux ou non nul pour indiquer vrai. Par exemple, les fonctions is * dans <ctype.h>
nécessite seulement zéro ou non-zéro, pas nécessairement zéro ou un.
Si vous convertissez cela en bool
, zéro sera converti en faux et non-nul en vrai (comme vous le pensiez).
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
, qui signifie souvent que toute valeur différente de 0 est considérée comme TRUE
.
Beaucoup de compilateurs modernes émettront un avertissement pour tout code essayant implicitement de transtyper de BOOL
en bool
si la valeur de BOOL
est différente de 0 ou 1.
J'ai trouvé différents compilateurs qui donnent des résultats différents sur true. J'ai également constaté qu'il est presque toujours préférable de comparer un bool à un bool au lieu d'un int. Ces ints ont tendance à changer de valeur au fil du temps, à mesure que votre programme évolue, et si vous supposez que la valeur est 1, vous pouvez vous faire piquer par un changement non lié ailleurs dans votre code.