Есть что-нибудь, что мешает этой форме использования теста XOR? - PullRequest
1 голос
/ 05 июля 2010

Есть что-нибудь, что мешает этой форме использования теста XOR?

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

 ...

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

Ответы [ 3 ]

9 голосов
/ 05 июля 2010

Я бы предпочел гораздо яснее:

if ( b1 != b2 )
 {
    result = true;
 }
4 голосов
/ 05 июля 2010

Нет, это вполне приемлемо (если вы правильно написали false в bool b2:]).

#include <iostream>

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

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

Выход: true ^ false

Конечно, в приведенном вами примере вы также можете сделать result = x1 ^ x2 в качестве сокращения.

Другой вопрос здесь заключается в том, было ли что-то, что мешало вам попробовать это самостоятельно.

0 голосов
/ 05 июля 2010

Я не уверен, что это хорошая идея.^ - побитовый оператор, а не логический.Так что 1 ^ 2 = 3. Я немного заржавел в C ++, но я думаю, что bool хранится как неподписанный символ или что-то в этом роде, поэтому

bool a= 1
bool b = 2

допустимо.

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

Чтобы использовать правильные значения true / false, вы должны сделать что-то вроде (!! a) ^ (!! b)

...