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

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

Oui. Les moulages sont redondants. Dans votre expression:

 true == 1 

La promotion intégrale s’applique et la valeur bool sera promue dans un int et cette promotion doit donner 1.

Référence: 4.7 [conv.integral] / 4: Si le type de source est booltrue est converti en un.

La réponse de Charles Bailey est correcte. Le libellé exact du standard C ++ est (§4.7 / 4): “Si le type de source est bool, la valeur false est convertie en zéro et la valeur true est convertie en un.”

Edit: Je vois qu’il a également ajouté la référence – je supprimerai cela sous peu si je ne suis pas distrait et que j’oublie …

Edit2: Encore une fois, il est sans doute utile de noter que si les valeurs booléennes sont toujours converties en zéro ou une, un certain nombre de fonctions (en particulier de la bibliothèque standard C) renvoient des valeurs “essentiellement booléennes”, mais représentées ne doivent normalement être que zéro pour indiquer faux ou non nul pour indiquer vrai. Par exemple, les fonctions is * dans ne nécessitent que zéro ou non-zéro, pas nécessairement zéro ou un.

Si vous lancez cela sur bool , zéro sera converti en false et non nul en true (comme prévu).

Selon la norme, vous devriez être en sécurité avec cette hypothèse. Le type bool C ++ a deux valeurs – true et false avec les valeurs correspondantes 1 et 0.

La chose à surveiller consiste à mélanger des expressions bool et des variables avec une expression et des variables BOOL . Ce dernier est défini comme FALSE = 0 et TRUE != FALSE , ce qui dans la pratique signifie souvent que toute valeur différente de 0 est considérée comme TRUE .

Un grand nombre de compilateurs modernes émettront un avertissement pour tout code qui tente implicitement de transtyper de BOOL vers bool si la valeur BOOL est différente de 0 ou 1.

J’ai trouvé différents compilateurs renvoyant 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 valeurs ont tendance à changer de valeur au fil du temps au fur et à mesure de l’évolution de votre programme et si vous vous en tenez à 1, vous pouvez être mordu par une autre modification de votre code.

Non, TRUE peut être arbitraire parmi les compilateurs. Certains utiliseront 1, d’autres -1 (tous les bits seront définis, signé var), d’autres compilateurs pourront utiliser une valeur différente. Même si la valeur est normalisée, tous les compilateurs ne peuvent pas suivre la norme.

FALSE, cependant, est le moment où tous les bits sont effacés, ce qui ne se produit que pour la valeur numérique 0.