Тож це скоріше теоретичне питання. C ++ і мови (in), безпосередньо засновані на ньому (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
став вбудованим типом, і якщо так, то чому вони вирішили проти цього.
(Примітка. Я знаю, що деякі люди вважають, що завдання не повинні використовувати
=
, ++
і +=
це не корисні оператори, але недоліки в дизайні; давайте просто припустимо, що я задоволений ними, і зосередимось на тому, чому вони не поширюватимуться на загальну кількість).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
хоч, що мені чомусь інтуїтивно зрозуміло ^= true
.
void Flip(bool& Flag) { Flag=!Flag; }
Скорочує ваше довге вираження.