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 = !a
sem repetir a expressão a
, por exemplo
!=a;
// or
a!!;
Vamos supor que nossa linguagem tenha um tipo booleano adequado (como bool
em C ++) e esse a
seja (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 bool
se 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.