Je peux supposer (bool)true == (int)1
pour tout compilateur C++ ?
Ceci n'est vrai que pour les primitives. Attention à la valeur de true provenant d'importations d'autres bibliothèques.
Je peux supposer (bool)true == (int)1
pour tout compilateur C++ ?
Ceci n'est vrai que pour les primitives. Attention à la valeur de true provenant d'importations d'autres bibliothèques.
@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.
@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.
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).
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.
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.
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.
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.
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.
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.
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. :)
1 votes
C'est vrai, je voulais indiquer le type de valeurs.
0 votes
IMHO cela ne signifie pas que tout ce qui n'est pas 1 est faux. int *ptr = new int[10] ; if (ptr) //new succeeded donc l'adresse est différente de zéro ce qui est faux et NONZERO est VRAI
2 votes
(int) true
es1
comme une valeur entière, mais quelque chose commeif (pointer)
passe par la partie alors sipointer != 0
. La seule chose que vous pouvez considérer comme vraie est quefalse == 0
ytrue != 0
(ettrue
évalue à1
lorsqu'il est transformé enint
)