Si un programme C ++ applique l'opérateur bitwise (~) à une valeur booléenne, cela invoque-t-on un comportement non défini?
E.g. est le programme suivant bien défini? p> (Oui, je sais qu'il y a un! opérateur mieux adapté à ce genre de chose; à des fins de cette question, nous ignorera son existence;)) p> p>
3 Réponses :
bool b = true; bool b1 = ~b; cout << b1;
Les opérateurs arithmétiques effectuent les promotions intégrées sur leur opérande. Spécifiquement [expr.unary.op] / 9 dit que cela se produit pour SO Les conversions entier-to-bool sont définies par [CONV.BOOL]: P>
une valeur zéro, une valeur de pointeur NULL ou une valeur de pointeur de membre nul est convertie en faux; Toute autre valeur est convertie en true p>
blockQuote>
donc Dans le complément de 1 - S'il y avait déjà un système C ++ utilisant 1 complément de 1 - l'effet de ~ code> aussi. P>
~ t code> est identique à celui
~ 1 code>. Cela donne un entier non zéro valide. P>
bool t2 = ~ t; code> rendements
t2 == true code>. Il n'y a pas de comportement indéfini. P>
~ f code> est identique à celui
~ 0 code>. Dans le complément de 2,
~ 0 code> donne
-1 code>, nous aurons donc
f2 == true code>. P>.
~ 0 code> n'est pas clair. SUB> P>
5.3.1 / 10 strong> L'opérande de
~ code> doit avoir un type d'énumération intégré ou non codifié; Le résultat est le complément de son opérande. Promotions intégrales sont effectuées. strong> [Mine mine] p>
4.5 / 6 strong> Un prvalue de type BOOL code> peut être converti en privalue de type
int code>, avec
false code > devenir zéro et
vrai code> devenir un. p>
4.5 / 7 strong> Ces conversions sont appelées Promotions intégrées em>. p> blockQuote> SO
~ FALSE code> est un
int code> avec un motif de bits composé de tous - un complément d'un motif de bits représentant 0, à savoir tous les zéros (comme requis par
3.9.1 / 7 strong>.) De même, ~ true code> est un
int code> c'est le complément de la représentation du bit de 1 - à savoir tous les autres avec le moins Bit significatif zéro. Ces deux valeurs évalueront à
true code> dans le contexte booléen. P>
@Mattmcnabb Où dit cette norme? Je cherchais réellement ce libellé et je défaut malheureusement. Il y a libellé à cet effet dans C99 6.2.6.2 B> - Peut-être aurait peut-être pu faire valoir que ce libellé est intégré à la norme C ++ par référence, mais cela ressemble à un argument assez faible. Est-ce que je manque quelque chose d'évident?
@Mattmcnabb Ah, à droite. "Système de numération binaire pur" est le terme d'art que j'ai oublié. Permettez-moi de mettre à jour la réponse.
Je suppose qu'il y a un peu de place pour discuter que zéro négatif pourrait être une représentation alternative de 0 code>, dans son complément
@Mattmcnabb C99, au moins, met une limitation sur la manière dont un zéro négatif peut être produit (fondamentalement, uniquement par bit Twiddling). Il suffit d'écrire 0 code> ou
(int) false code> ne devrait pas le faire. Mais oui, la norme C ++ n'a pas de formulation similaire.
Je suppose que
~ code> favorise l'argument à
int code> avant de faire quoi que ce soit de toute façon, donc 0 serait converti sur
vrai code>. Ne peut pas être sûr à 100% sans regarder.
@chris, tu as raison.
est-ce ub de faire
bool b = 13; code> [ou quelque chose comme ça]?
@Matspetersson: Non, le
int code> la valeur
13 code> est implicitement converti en
bool code>, céder
vrai code>.