How does a Java if statement work when it has an assignment and an equality check OR
-d together??
public static void test() {
boolean test1 = true;
if (test1 = false || test1 == false) {
System.out.println("TRUE");
} else {
System.out.println("FALSE");
}
}
Why is this printing FALSE?
test1=false
, test1==false
is false
, false || false
is false or false
which is false
.
test1 = true
The expression is not parsed the way you think. It's not
(test1=false) || (test1 == false)
in which case the result would have been true
, but
test1 = (false || test1 == false)
The value of false || test1 == false
expression is computed first, and it is false
, because test1
is set to true
going into the computation.
The reason it is parsed this way is that the precedence of the ||
is lower than that of the ==
operator, but higher than the precedence of the assignment operator =
.
This is a precedence issue, basically. You're assuming that your code is equivalent to:
if ((test1 = false) || (test1 == false))
... but it's not. It's actually equivalent to:
if (test1 = (false || test1 == false))
... which is equivalent to:
if (test1 = (false || false))
(because test1
is true
to start with)
... which is equivalent to:
if (test1 = false)
which assigns the value false
to test1
, with the result of the expression being false
.
See the Java tutorial on operators for a useful table of operator precedence.
https://i.stack.imgur.com/UcG6x.gif
Expression test1 = false || test1 == false
will evaluate in following step.
STEP:1- test1 = false || test1 == false
//precedence of ==
is highest
STEP:2- test1 = false || false
// Operator ||
have higher precedence
STEP:3- test1 = false
STEP:4- false
Since boolean value of expression becomes false.So else statement is being executed.
(test1 = false || test1 == false)
returns false, because both of them are false.(test1 = false || test1 == true)
this is true because one of them is true
Success story sharing
((test1 = false) || test1 == false)
the overall value would betrue
.==
is above||
, but=
is below||
.||
). The relative precedence of||
and==
is only relevant to show that parsing is not as intest1 = ((false || test1) == false)
, which I don't think anybody would reasonably expect (by the way that relative precedence, or more generally that||
,&&
have lower precedence than relations, is also easy to remember, since used all the time).||
and==
vs||
and=
explains why this behaves differently from the (common) case ofa == b || c == d
.