web-dev-qa-db-fra.com

Puis-je supposer (bool) true == (int) 1 pour tout compilateur C ++?

Puis-je supposer (bool)true == (int)1 pour tout compilateur C++?

109
Petruza

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.

128
CB Bailey

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 ints 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).

18
Jerry Coffin

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.

7
Franci Penov

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.

3
Michael Dorgan