So this is more of a theoretical question. C++ and languages (in)directly based on it (Java, C#) have shortcut operators for assigning the result of most binary operators to the first operand, such as
a += 3; // for a = a + 3 a *= 3; // for a = a * 3; a <<= 3; // for a = a << 3;
but when I want to toggle a boolean expression I always find myself writing something like
a = !a;
which gets annoying when
a is a long expression like.
this.dataSource.trackedObject.currentValue.booleanFlag = !this.dataSource.trackedObject.currentValue.booleanFlag;
(yeah, Demeter's Law, I know).
So I was wondering, is there any language with a unary boolean toggle operator that would allow me to abbreviate
a = !a without repeating the expression for
a, for example
!=a; /* or */ a!!;
Let's assume that our language has a proper boolean type (like
bool in C++) and that
a is of that type (so no C-style
int a = TRUE).
If you can find a documented source, I'd also be interested to learn whether e.g. the C++ designers have considered adding an operator like that when
bool became a built-in type and if so, why they decided against it.
(Note: I know that some people are of the opinion that assignment should not use
= and that
+= are not useful operators but design flaws; let's just assume I'm happy with them and focus on why they would not extend to bools).
... that would allow me to abbreviate
a = !awithout repeating the expression for
This is approach is not really a pure "mutating flip" operator, but does fulfill your criteria above; the right hand side of the expression does not involve the variable itself.
Any language with a boolean XOR assignment (e.g.
^=) would allow flipping the current value of a variable, say
a, by means of XOR assignment to
// type of a is bool a ^= true; // if a was false, it is now true, // if a was true, it is now false
As pointed out by @cmaster in the comments below, the above assumes
a is of type
bool, and not e.g. an integer or a pointer. If
a is in fact something else (e.g. something non-
bool evaluating to a "truthy" or "falsy" value, with a bit representation that is not
0b0, respectively), the above does not hold.