10
votes

Utilise Bitwise PAS Opérateur (~) sur les valeurs booléennes invoqué un comportement non défini?

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? xxx

(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;))


4 commentaires

Je suppose que ~ favorise l'argument à int avant de faire quoi que ce soit de toute façon, donc 0 serait converti sur vrai . Ne peut pas être sûr à 100% sans regarder.


@chris, tu as raison.


est-ce ub de faire bool b = 13; [ou quelque chose comme ça]?


@Matspetersson: Non, le int la valeur 13 est implicitement converti en bool , céder vrai .


3 Réponses :


1
votes
  bool b = true;
  bool b1 = ~b;
  cout << b1;

0 commentaires

3
votes

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 ~ aussi.

SO ~ t est identique à celui ~ 1 . Cela donne un entier non zéro valide.

Les conversions entier-to-bool sont définies par [CONV.BOOL]:

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

donc bool t2 = ~ t; rendements t2 == true . Il n'y a pas de comportement indéfini.


~ f est identique à celui ~ 0 . Dans le complément de 2, ~ 0 donne -1 , nous aurons donc f2 == true . .

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 ~ 0 n'est pas clair.


0 commentaires

8
votes

5.3.1 / 10 L'opérande de ~ 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. [Mine mine]

4.5 / 6 Un prvalue de type BOOL peut être converti en privalue de type int , avec false devenir zéro et vrai devenir un.

4.5 / 7 Ces conversions sont appelées Promotions intégrées .

SO ~ FALSE est un int 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 .) De même, ~ true est un int 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 dans le contexte booléen.


4 commentaires

@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 - 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 , 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 ou (int) false ne devrait pas le faire. Mais oui, la norme C ++ n'a pas de formulation similaire.