Почему в этом примере "x ^ = true" выдает false - PullRequest
4 голосов
/ 06 января 2010

Почему выражение z ^ = true выдает false, когда предыдущее выдает true?

bool v = true;
bool z = false;

z ^= v;
Console.WriteLine(z);

z ^= true;
Console.WriteLine(z);

OUTPUT
======
True
False

Ответы [ 6 ]

20 голосов
/ 06 января 2010

Потому что это изменяет значение z в первом операторе.

15 голосов
/ 06 января 2010

Потому что:

false ^ true == true
true ^ true == false

См. http://en.wikipedia.org/wiki/Xor

7 голосов
/ 06 января 2010

^ Означает XOR, XOR определяется как true, если одна, но не обе стороны верны, и определяется как false во всех остальных случаях.

Так

z ^ = v означает z = false ^ true, что означает true

z ^ = true означает z = true ^ true, что неверно

Обратите внимание, что ^ = изменяет значение переменной в первом и втором утверждении

2 голосов
/ 06 января 2010

Таблица истинности для XOR (^) равна

a    b    a^b
0    0     0
0    1     1
1    0     1
1    1     0

Операция lhs ^= rhs - это просто сокращение для lhs = lhs ^ rhs. Итак, в вашем первом приложении ^= вы изменяете значение z, которое (в соответствии с определением ^) меняет результат второго приложения.

1 голос
/ 06 января 2010

Выражение вида x ^= y оценивается как x = x ^ y

Результат x ^ y (XOR) равен true тогда и только тогда, когда точно один из его операндов равен true .

вывод: x ^ = true даст true , когда x == true .

1 голос
/ 06 января 2010

false XOR true = true, тогда для z вы устанавливаете значение true; true XOR true = false, тогда вы устанавливаете z в false.

...