Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does this if statement, with an assignment and equality check, evaluate to false?

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?

like image 579
RoHaN Avatar asked Apr 16 '15 09:04

RoHaN


2 Answers

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 =.

like image 149
Sergey Kalinichenko Avatar answered Oct 24 '22 12:10

Sergey Kalinichenko


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.

like image 24
Jon Skeet Avatar answered Oct 24 '22 12:10

Jon Skeet