What is the difference between != and =! in Java? [duplicate]
I was looking over some mock OCJP questions. I came across a really baffling syntax. Here it is:
class OddStuff {
public static void main(String[] args) {
boolean b = false;
System.out.println((b != b));// False
System.out.println((b =! b));// True
}
}
Why does the output change between !=
and =!
?
The question is just playing with you with confusing spacing.
b != b
is the usual !=
(not equals) comparison.
On the other hand:
b =! b
is better written as b = !b
which is parsed as:
b = (!b)
Thus it's two operators.
- First invert
b
. - Then assign it back to
b
.
The assignment operator returns the assigned value. Therefore, (b =! b)
evaluates to true - which is what you print out.
b != b
means ! (b == b)
: the opposite of b == b
.
b =! b
is actually b = !b
, an assignment. It's toggling b
's value. An assignment evaluates to the value of the expression, so this will evaluate to !b
(along with having changed the value of b
).
b=!b
is an assignment. It assigns b
to !b
and the expression evaluates to the resulting value, which is true
.