Так что это скорее теоретический вопрос. C ++ и языки (в), непосредственно основанные на нем (Java, C #, PHP), имеют операторы быстрого доступа для присвоения результата большинства бинарных операторов первому операнду, например
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
но когда я хочу переключить логическое выражение, я всегда пишу что-то вроде
a = !a;
что раздражает, когда aэто длинное выражение вроде.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(да, я знаю Закон Деметры).
Поэтому мне было интересно, есть ли какой-нибудь язык с унарным логическим оператором переключения , который позволил бы мне сокращать, a = !aне повторяя выражение a, например
!=a;
// or
a!!;
Предположим, что у нашего языка есть правильный логический тип (например, boolв C ++), и он aотносится к этому типу (поэтому нет стиля C int a = TRUE).
Если вы можете найти документированный источник, мне также было бы интересно узнать, рассматривали ли, например, разработчики C ++ возможность добавления такого оператора, когда он boolстал встроенным типом, и если да, то почему они отказались от него.
(Примечание: я знаю, что некоторые люди считают, что присваивание не следует использовать
=и что операторы не являются полезными , ++а +=являются недостатками дизайна; давайте просто предположим, что я доволен ими, и сосредоточимся на том, почему они не распространяются на bools).
void Flip(bool& Flag) { Flag=!Flag; }The сокращает ваше длинное выражение.