Portanto, essa é mais uma questão teórica. C ++ e linguagens (in) diretamente baseadas nele (Java, C #, PHP) possuem operadores de atalho para atribuir o resultado da maioria dos operadores binários ao primeiro operando, como
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
mas quando quero alternar uma expressão booleana, sempre me pego escrevendo algo como
a = !a;
o que fica irritante quando aé uma expressão longa como.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(sim, a Lei de Demeter, eu sei).
Então, eu estava pensando, existe algum idioma com um operador de alternância booleano unário que me permita abreviar a = !asem repetir a expressão a, por exemplo
!=a;
// or
a!!;
Vamos supor que nossa linguagem tenha um tipo booleano adequado (como boolem C ++) e esse aseja (sem estilo C int a = TRUE).
Se você pode encontrar uma fonte documentada, eu também estaria interessado em saber se, por exemplo, os designers de C ++ consideraram adicionar um operador como esse quando boolse tornou um tipo interno e, se sim, por que decidiram contra.
(Nota: Eu sei que algumas pessoas são da opinião de que a atribuição não deve usar
=e que ++e +=não são operadores útil, mas falhas de projeto, vamos apenas supor que eu estou feliz com eles e foco em por que eles não se estenderia até bools).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1, porém, que por algum motivo eu acho mais intuitivo do que ^= true.
void Flip(bool& Flag) { Flag=!Flag; }Encurta sua longa expressão.