Тож це скоріше теоретичне питання. 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; }Скорочує ваше довге вираження.