Правильное руководство логическое реализация XOR зависит от того, насколько вы хотите, чтобы имитировать общее поведение других логических операторов (||
и &&
) с вашей XOR. Есть две важные вещи об этих операторах: 1) они гарантируют оценку короткого замыкания, 2) вводят точку последовательности, 3) они оценивают свои операнды только один раз.
Оценка XOR, как вы понимаете, не может быть закорочена, поскольку результат всегда зависит от обоих операндов. Так что 1 не может быть и речи. Но как насчет 2? Если вам все равно 2, то с нормализованным (то есть bool
) значением оператор !=
выполняет работу XOR по результату. При этом операнды можно легко нормализовать с помощью унарного !
. Таким образом, !A != !B
реализует надлежащий XOR в этом отношении.
Но если вам небезразлична дополнительная точка последовательности, ни !=
, ни побитовый ^
- это правильный способ реализации XOR. Один из возможных способов сделать XOR (а, б) правильно может выглядеть следующим образом
a ? !b : b
Это на самом деле так близко, как вы можете получить, чтобы сделать самодельный XOR «похожий» на ||
и &&
. Это будет работать, конечно, только если вы реализуете свой XOR в качестве макроса. Функция не будет выполняться, так как секвенирование не будет применяться к аргументам функции.
Кто-то может сказать, что единственная причина наличия точки последовательности в каждом &&
и ||
заключается в поддержке короткозамкнутой оценки, и, следовательно, XOR не нуждается в ней. На самом деле это имеет смысл. Тем не менее, стоит подумать о том, что XOR с точкой последовательности посередине. Например, следующее выражение
++x > 1 && x < 5
определил поведение и specificed результат в C/C++ (в отношении последовательности, по меньшей мере). Таким образом, можно было бы разумно ожидать того же от заданного пользователя логического XOR, как и в
XOR(++x > 1, x < 5)
в то время как !=
основанного XOR не обладает этим свойством.
На самом деле, Джим, это не единственная разница между & и &&, например ... 1 && 2 - True. но 1 & 2 => 0. Из-за этого я считаю, что «короткое замыкание» - это просто свойство, которое у них есть. Логическая - более важная функция ... –
Не говоря уже о том, что 2 && 3 == true, но 2 & 3 == 2. –
David Thomley: Ну да, но 2 ==> true, так что все в порядке ... Помните, что на самом деле не существует никаких логических элементов ... –