Toggling the boolean bit
… that would allow me to abbreviate
a = !a
without repeating the
expression fora
…
This 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 true
:
// 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 0b1
or 0b0
, respectively), the above does not hold.
For a concrete example, Java is a language where this is well-defined and not subject to any silent conversions. Quoting @Boann’s comment from below:
In Java,
^
and^=
have explicitly defined behavior for booleans
and for integers
(15.22.2.
Boolean Logical Operators&
,^
, and|
), where either both sides
of the operator must be booleans, or both sides must be integers.
There’s no silent conversion between those types. So it’s not going to
silently malfunction ifa
is declared as an integer, but rather,
give a compile error. Soa ^= true;
is safe and well-defined in
Java.
Swift: toggle()
As of Swift 4.2, the following evolution proposal has been accepted and implemented:
- SE-0199: Adding toggle to Bool
This adds a native toggle()
function to the Bool
type in Swift.
toggle()
Toggles the Boolean variable’s value.
Declaration
mutating func toggle()
Discussion
Use this method to toggle a Boolean value from
true
tofalse
or
fromfalse
totrue
.var bools = [true, false] bools[0].toggle() // bools == [false, false]
This is not an operator, per se, but does allow a language native approach for boolean toggling.