2010-07-05 16 views
1

Y a-t-il quelque chose qui empêche cette forme d'utilisation du test XOR?Y at-il quelque chose qui empêche cette forme d'utilisation du test XOR?

 
bool result = false; 
bool b1 = false; 
bool b2 = false; 

... 

if (b1^b2) 
{ 
    result = true; 
} 
+3

Pourquoi voudriez-vous? –

+2

Je ne veux pas être grossier ici ... mais c'est le genre de chose qui peut être facilement testé. – ereOn

+1

@ ere0n: En fait, je pense que c'est assez dépendante de l'implémentation, donc je ne dirais pas qu'il est facile à tester. –

Répondre

9

Je préférerais le plus clair:

if (b1 != b2) 
{ 
    result = true; 
} 
+1

+1 Fantastique :) – AraK

+0

Dépend du contexte. Si vous essayez de faire un XOR, alors c'est ce que vous devriez écrire. –

+1

@Peter L'opérateur XOR sert à manipuler les bits. Il n'y a généralement aucune raison de faire de telles manipulations avec bools. –

4

Non, c'est tout à fait acceptable (si vous épelez correctement false dans bool b2:]).

#include <iostream> 

int main() 
{ 
    if (false^false) 
    { 
     std::cout << "false^false" << std::endl; 
    } 

    if (true^false) 
    { 
     std::cout << "true^false" << std::endl; 
    } 
} 

Sortie: true^false

Bien sûr, dans l'exemple que vous avez fourni, vous pouvez aussi faire result = x1^x2 comme raccourci.

L'autre question ici est de savoir s'il y avait quelque chose qui vous empêchait d'essayer vous-même.

0

Je ne suis pas sûr que c'est une bonne idée. Le^est un opérateur bitwise pas un logique. donc 1^2 = 3. Je suis un peu rouillé en C++, mais je pense que bool sont stockées sous forme unsigned char ou quelque chose de si

bool a= 1 
bool b = 2 

est valide.

a == true; // yes 
b == true; // yes 
a^b == true; // yes. not what you are expecting :-(

Pour être sûr d'utiliser les bonnes valeurs vrai/faux, vous devez faire quelque chose comme (!! a)^(!! b)

+0

Il est trop rouillé. Un 'bool' peut être soit' true' ou 'false', et' true^true == false'. Bitrepresentations sont (comme d'habitude) jusqu'au compilateur. – MSalters

+0

Je suis sûr qu'ils sont encore vieux compilateur C++ quelque part qui ont ce comportement;) – mb14