Tricky Java:if条件中的布尔赋值

时间:2014-01-16 23:03:45

标签: java initialization boolean

我正在努力为OCA Java认证做好准备,并且遇到了一些在if条件下处理任务的问题。谁能解释一下下面代码中不同行为的原因?根据我的观点,我只是将相同的两个布尔值放在“包含或”条件下6次......

package pck;

 class SuperMain{
    boolean b;
    public static void main(String args[]){
        new SuperMain();
    }
    SuperMain(){
        if(_true()|_false())
            System.out.println(b); //1 - prints false
        if(b=true|_false())
            System.out.println(b); //2 - prints true
        if(_true()|(b=false))
            System.out.println(b); //3 - prints false
        if((b=true)|_false())
            System.out.println(b); //4 - prints false
        if(b=true|(b=false))
            System.out.println(b); //5 - prints true
        if((b=true)|(b=false))
            System.out.println(b); //6 - prints false
    }
    boolean _true(){return b=true;}
    boolean _false(){return b=false;}
}

1 个答案:

答案 0 :(得分:15)

区别在于precedence|具有比=更高的优先级(“绑定更严格”)。

所以这个:

if(b=true|_false())

实际上是:

if (b = (true | _false()))
    ...

同样如此:

if(b=true|(b=false))

实际上是:

if (b = (true | (b = false))

在这些情况下,falseb的分配会在分配trueb之前发生 ...所以{{ 1}}最终成为b。在所有其他情况下,分配以相反的顺序发生。