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

puis-je supposer (bool)true == (int)1 pour n'importe quel compilateur C++?

104
demandé sur chema989 2010-04-28 00:54:36

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.

122
répondu CB Bailey 2010-04-27 21:14:29

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

18
répondu Jerry Coffin 2010-04-27 21:05:56

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.

6
répondu Franci Penov 2010-04-27 21:04:12

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.

4
répondu Michael Dorgan 2010-04-27 20:59:05

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.

-9
répondu Sukasa 2010-04-27 20:56:28