126 votes

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

Je peux supposer (bool)true == (int)1 pour tout compilateur C++ ?

3 votes

Les moulages dans votre question sont redondants, faut-il les inverser ?

11 votes

Il ne veut pas dire qu'ils sont moulés, il veut dire bool t = true; int n = 1; if (t == n) {...} ;

7 votes

@egrunin : Eh, mais true est un bool et 1 est un int de toute façon. :)

151voto

Charles Bailey Points 244082

Oui. Les plâtres sont redondants. Dans votre expression :

true == 1

La promotion intégrale s'applique et la valeur bool sera promue à un format int et cette promotion doit donner 1.

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

0 votes

Ceci n'est vrai que pour les primitives. Attention à la valeur de true provenant d'importations d'autres bibliothèques.

0 votes

@GMan : Merci pour le vote de confiance. Si un compilateur promeut true à toute autre valeur entière, alors ce n'est pas un compilateur C++ conforme.

9 votes

@Joshua : true est un mot-clé défini par la langue. Il ne peut pas être redéfini par une bibliothèque. #define ne sont pas autorisés à redéfinir les mots-clés.

18voto

Jerry Coffin Points 237758

La réponse de Charles Bailey est correcte. La formulation exacte de la norme C++ est (§4.7/4) : "Si le type 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 vais supprimer ceci sous peu, si je ne suis pas distrait et n'oublie pas...

Edit2 : Encore une fois, il est probablement utile de noter que, bien que les valeurs booléennes elles-mêmes se convertissent toujours en zéro ou un, un certain nombre de fonctions (en particulier celles de la bibliothèque standard C) renvoient des valeurs qui sont "fondamentalement booléennes", mais représentées sous la forme de int qui ne doivent normalement être que zéro pour indiquer faux ou non zéro pour indiquer vrai. Par exemple, les fonctions is* de <ctype.h> n'exigent que zéro ou une valeur différente de zéro, pas nécessairement zéro ou un.

Si vous le transformez en bool le zéro sera converti en faux, et le non-zéro en vrai (comme on peut s'y attendre).

9voto

Franci Penov Points 45358

D'après la norme, vous devriez être en sécurité avec cette hypothèse. La norme C++ bool a deux valeurs - true y false avec les valeurs correspondantes 1 et 0.

La chose à laquelle il faut faire attention est le mélange bool les expressions et les variables avec BOOL l'expression et les variables. Ces dernières sont définies comme suit FALSE = 0 y TRUE != FALSE ce qui, dans la pratique, signifie souvent que toute valeur différente de 0 est considérée comme étant TRUE .

De nombreux compilateurs modernes émettent un avertissement pour tout code qui tente implicitement de faire un casting à partir de BOOL a bool si le BOOL est différente de 0 ou 1.

4voto

Michael Dorgan Points 7849

J'ai constaté que différents compilateurs renvoient 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 plutôt qu'à un int. Ces int ont tendance à changer de valeur au fil du temps, au fur et à mesure que votre programme évolue, et si vous supposez que true est égal à 1, vous pouvez vous faire piquer par un changement sans rapport ailleurs dans votre code.

4 votes

C'est une réponse incorrecte pour C++, car true est un mot-clé du langage avec un comportement défini. Si vous faites référence à une macro communément définie telle que TRUE c'est correct.

1 votes

Il se peut que mon expérience se limite aux compilateurs C - j'ai passé beaucoup de temps avec eux au fil des ans. Mon point de vue sur l'utilisation directe d'expressions mathématiques dans les instructions if reste cependant valable. Nous avions du code qui voyait si un décalage de bit était non nul dans un if, puis quelqu'un d'autre prenait cette même valeur non nulle et supposait que c'était 1 et faisait exploser des trucs. Une simple conversion en true/1 aurait permis d'éviter cela.

0 votes

Moi aussi, j'ai vu ce genre de comportement. Certes, la dernière fois que je l'ai vu, c'était vers 1999. J'utilisais GCC. Le langage était le C. Pourtant, j'ai effectivement vu un tel comportement.

-4voto

Williham Totland Points 15798

Vous ne devez jamais vérifier si true et vous ne devriez jamais avoir à le faire. La valeur peut être complètement arbitraire, la seule garantie que vous avez est que false == 0 et que true != false .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X