ChatGPT解决这个技术问题 Extra ChatGPT

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?

Run and check. See what boolean value is printed if you assign false and if you assign true. Then read on how OR works.
I would like to tell that this code on debug mode gives TRUE value and on Running mode gives FALSE value... Why it is so ???... (I put my breakpoint on if condition)...
test1=false, test1==false is false, false || false is false or false which is false.
I know you weren't asking for advice, but as the answers below identify a precedence issue, here are a couple of practices that have helped me avoid trouble (when I stick to these): (1) always use parentheses when not 100% certain of precedence or for easier legibility to help other developers. Don't assume others will remember precedence rules for all operators (2) if-assignments should generally be avoided to reduce confusion except for very simple if-conditions. There are some common exceptions (especially with simple checks for I/O, networking, etc). Just my two cents.
because test1 = true

S
Sergey Kalinichenko

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


+1 @RohanFernando, please also note that if you would add brackets around the assignment like so: ((test1 = false) || test1 == false) the overall value would be true.
Please write the reason why parsing happens so...Is it because of the priority order of operators?
@kondu That's a fair follow-up question, I edited to add a link to a precedence table, which shows that == is above ||, but = is below ||.
The final paragraph is misleading, in the sense that to understand why the second parsing is chosen rather than the first, it suffices to know the (easily remembered) rule that assignment has lower precedence any non-assignment operator (here ||). The relative precedence of || and == is only relevant to show that parsing is not as in test1 = ((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).
@MarcvanLeeuwen The relative precedence of || and == vs || and = explains why this behaves differently from the (common) case of a == b || c == d.
J
Jon Skeet

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.


D
Den

(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


Completely wrong. Why would you answer with such incorrect information days after the question has received two high quality answers which describe what happens?
Two answers of such low quality do not deserve individually written comments. You do realize your answer is nonsense, right? If not, carefully read the two answers by Jon and blinkenlight.