Думай логически, а не бит
Таким образом, решение вашего профессора лучше (но все же неправильно, строго говоря, смотрите далее), потому что оно использует логические операторы вместо побитовых операторов и рассматривает логические операторы как целые числа. Выражение c==1
для представления «c является истинным» является неправильным, потому что, если c может быть числом (в соответствии с заявленным присваиванием), тогда любое ненулевое значение c следует рассматривать как представляющее true
.
Посмотрите на этот вопрос, почему лучше не сравнивать логические значения с 0 или 1, даже если это безопасно.
Одна очень веская причина не использовать xor
это то, что это побитовое исключение или операция. Это работает в вашем примере, потому что и левая, и правая части являются логическими выражениями, которые преобразуются в 1 или 0 (см. Снова 1 ).
Булево исключение - или есть на самом деле !=
.
Разбивая выражение
Чтобы лучше понять решение вашего преподавателя, проще всего заменить логические операторы их эквивалентами «альтернативного токена», что превращает его в более читаемый (imho) и полностью эквивалентный код C ++: использование «not» для «!» и 'и' для '&&' вы получаете
(not a and not b) != c
К сожалению, нет логического exclusive_or
оператора, кроме not_eq
, который не помогает в этом случае.
Если мы разобьем выражение на естественном языке:
Либо a, либо b оба имеют значение false, либо c соответствует true, но не оба.
сначала в предложении о булевых предложениях A и B:
Либо А, либо Б, но не оба.
это переводится в A != B
(только для логических значений, а не для любых типов A и B).
Тогда предложение А было
а и б оба ложные
который может быть заявлен как
а ложь и б ложь
который переводит в (not a and not b)
, и, наконец,
с правда
Который просто переводит на c
. Объединяя их, вы получаете снова (not a and not b) != c
.
Для дальнейшего объяснения того, как тогда работает это выражение, я приведу таблицы истинности, которые другие дали в своих ответах.
Вы оба не правы
И если я могу придираться: в первоначальном присваивании говорилось, что a, b и c могут быть неотрицательными числами, но не однозначно указывалось, что если бы они были числами, они должны быть ограничены значениями 0 и 1. Если любое число является не 0 представляет true
, как обычно, тогда следующий код даст неожиданный ответ :
auto c = 2; // "true" in some way
auto a = 0; // "false"
auto b = 0; // "false"
std::cout << ((!a && !b) != c);
// this will output: 1 (!)
// fix by making sure that != compares booleans:
std::cout << ((!a && !b) != (bool)c);
a == b or c
вместоa == b or a ==c
. Проблема в том, что разговорный язык является неточным, и фактически обе интерпретации могут быть действительными