VirQ. Понятие оператора ^ (исключающее ИЛИ) в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная / Булевы переменные /
Понятие оператора ^ (исключающее ИЛИ)
Статей на сайте: 61

Понятие оператора ^ (исключающее ИЛИ)


Данный оператор встречается редко. Как в программировании, так и в жизни. Он показывает результат "True", если оба значения разные. Так как мы работаем с bool-типами, то тут только 4 варианта с 2 переменными:

1 переменная 2 переменная Результат Подсказка
True True False Одинаковые
True False True Разные
False True True Разные
False False False Одинаковые

Например, чтобы показать это в коде, это будет так. Допустим какая-то игра есть, в которой имитируются 2 игральные кости от 1 до 6. Но правило такое, что если выпал куш (одинаковые значения), то нужно перебросить их ещё раз.
Класс Random помогает выбрать любые числа. Загадывать их будет компьютер:

[code] int a = -1; int b = -1; bool r = false; //Тут будет результат //Это стартовые значения. //И то, что они одинаковые //и имеют недопустимое, значение для игральной кости, //сейчас не обращайте внимание Random rnd = new Random(); //Создали экземпляр класса Random для генерации чисел do { a = rnd.Next(1, 6); //Выбрать любое число от 1 до 6 для 1 кубика b = rnd.Next(1, 6); //Выбрать любое число от 1 до 6 для 2 кубика r = a ^ b; //Самое главное тут в коде } while (!r); //Об этом ниже [/code]

Пояснение к коду:
Когда в "а" и "b" сгенерировались числа, например 3 и 5, то в "r" мы получим результат true (разные)
Нам это и надо и тогда на while всё закончится. Чтобы это понять, смотрим другой случай:

Когда в "а" и "b" сгенерировались одинаковые числа, например, 4 и 4, тогда в "r" мы получим false.
В скобках после while указано условие, при котором нужно цикл повторить ещё раз, начиная с оператора "do".
!r - это отрицание.
В "r" и так false получилось
А отрицание отрицания даёт положительный результат. Чтобы было проще понимать, это можно было бы так записать:

Вместо такого:
[code] do { a = rnd.Next(1, 6); b = rnd.Next(1, 6); r = a ^ b; } while (!r); [/code]
Вот так:
[code] do { a = rnd.Next(1, 6); b = rnd.Next(1, 6); r = a ^ b; } while (r == false); //Продолжить, если false (одинаковые) [/code]

Так условия обычно никогда не записывают. Об этом подробнее прочитать можно в условиях
Так же есть альтернативные написания кода без переменной r (привожу полный код):
[code] int a = -1; int b = -1; Random rnd = new Random(); do { a = rnd.Next(1, 6); b = rnd.Next(1, 6); } while (!(a ^ b)); [/code]
Обратите внимание, что выражение a ^ b взято в скобки.
Потом ставится отрицание !(a ^ b).
А двойные скобки, потому что whlie () условие содержит в скобках.
Само выражение while (!(a ^ b)) имеет дословный смысл: "Продолжить, пока числа "а" и "b" НЕ разные".
while - пока
! - не
a ^ b даст true, если числа разные

Или можно вообще без ^:
[code] int a = -1; int b = -1; Random rnd = new Random(); do { a = rnd.Next(1, 6); b = rnd.Next(1, 6); } while (a != b); //Продолжить, если a не равно b [/code]

Для дополнительных объяснений цикла while читайте тут
Подробнее о символе "^" в булевых выражениях
Подробнее о символе "^" над числами

Дополнительная информация о том, как вывести результат в консоли или WinForm