cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

добавить логический оператор XOR (исключающее ИЛИ) #462

Open toughengineer opened 3 years ago

toughengineer commented 3 years ago

Сабж.
Предлагаю символ ^^ по модели остальных оперторов: & и &&, | и ||.

Для булевых аргументов в качестве исключающего ИЛИ работает !=, например:

const bool smart = isSmart();
const bool handsome = isHandsome();
const bool isPossible = smart != handsom;

Но всё равно в этом случае читаемость ниже плинтуса и парсинг физического смысла такого выражения будет не мгновенным.

Для типов кроме булева всё ещё грустнее, потому что != в отличие от логических операторов не делает контекстного преобразования в булев тип. Например, такое:

int i = 42;
void *ptr = nullptr;
const auto sadsob = i != ptr; // не работает
const auto visibledisgust = !!i != !!ptr; // *sigh*

С логическим исключающим ИЛИ имхо выглядит намного лучше:

int i = 42;
void *ptr = nullptr;
const auto uwu = i ^^ ptr;
naf2000 commented 2 years ago

Смысл && и || в том, что, зная левое значение, возможно не стоит вычислять правое, а сразу получить результат. В операции XOR это математически невозможно.

Izaron commented 2 years ago

Неплохо бы еще иметь диграф для ^^

Правда, он не попадет под общий стиль:

& - bitand
&& - and
| - bitor
|| - or
^ - xor
^^ - ?????????

Варианты: bool_xor, xor_bool, xorxor, bxor; либо несвязанное с xor название: ex_or (exclusive or).

int i = 42;
void *ptr = nullptr;
const auto uwu = i bool_xor ptr;

Мне нравится ex_or или bool_xor.

tomilov commented 2 years ago

&&, || - это не "диграфы". Это основное написание операторов и оно не имеет альтернативного в виде диграфов.

kirillgrachoff commented 2 years ago

Есть же !=. Чем не ^^?