Entonces esta es más una pregunta teórica. C ++ y los lenguajes (in) directamente basados en él (Java, C #, PHP) tienen operadores de acceso directo para asignar el resultado de la mayoría de los operadores binarios al primer operando, como
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
pero cuando quiero alternar una expresión booleana siempre me encuentro escribiendo algo como
a = !a;
lo que se vuelve molesto cuando a
es una expresión larga como.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(Sí, la Ley de Demeter, lo sé).
Así que me preguntaba, ¿hay algún lenguaje con un operador de alternancia booleano unario que me permita abreviar a = !a
sin repetir la expresión para a
, por ejemplo
!=a;
// or
a!!;
Supongamos que nuestro lenguaje tiene un tipo booleano adecuado (como bool
en C ++) y que a
es de ese tipo (por lo que no tiene estilo C int a = TRUE
).
Si puede encontrar una fuente documentada, también me interesaría saber si, por ejemplo, los diseñadores de C ++ han considerado agregar un operador como ese cuando bool
convirtió en un tipo incorporado y, de ser así, por qué decidieron no hacerlo.
(Nota: Sé que algunas personas son de la opinión de que la asignación no se debe usar
=
y que ++
y +=
no son útiles, pero los operadores de defectos de diseño, vamos a asumir que estoy feliz con ellos y se centran en por qué no se extenderían a Bools).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
, sin embargo, que por alguna razón me parece más intuitivo que ^= true
.
void Flip(bool& Flag) { Flag=!Flag; }
Acorta tu expresión larga.