为什么带有赋值和等式检查的if语句的计算结果为false?

RoH*_*HaN 104 java logic if-statement

Java if语句如何在具有赋值和相等性检查时OR一起工作?

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}
Run Code Online (Sandbox Code Playgroud)

为什么这个打印错误?

das*_*ght 189

表达式不会按您的思路解析.不是

(test1=false) || (test1 == false)
Run Code Online (Sandbox Code Playgroud)

在这种情况下结果会是true,但是

test1 = (false || test1 == false)
Run Code Online (Sandbox Code Playgroud)

false || test1 == false首先计算表达式的值false,因为它test1被设置为true进入计算.

它被解析这种方式的原因是,优先级||比的降低==操作者,但比赋值运算符的优先级更高=.

  • @kondu这是一个公平的后续问题,我编辑了添加一个优先表的链接,它表明`==`高于`||`,但`=`低于`||`. (3认同)
  • +1 @RohanFernando,请注意,如果你要在赋值周围添加括号,如:`((test1 = false)|| test1 == false)`整体值为'true`. (2认同)

Jon*_*eet 83

这基本上是一个优先问题.您假设您的代码相当于:

if ((test1 = false) || (test1 == false))
Run Code Online (Sandbox Code Playgroud)

......但事实并非如此.它实际上相当于:

if (test1 = (false || test1 == false))
Run Code Online (Sandbox Code Playgroud)

......相当于:

if (test1 = (false || false))
Run Code Online (Sandbox Code Playgroud)

(因为test1true开始)

......相当于:

if (test1 = false)
Run Code Online (Sandbox Code Playgroud)

其分配值falsetest1,用该表达是的结果false.

有关运算符优先级的有用表,请参阅运算符Java教程.