我正在努力为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;}
}
答案 0 :(得分:15)
区别在于precedence。 |
具有比=
更高的优先级(“绑定更严格”)。
所以这个:
if(b=true|_false())
实际上是:
if (b = (true | _false()))
...
同样如此:
if(b=true|(b=false))
实际上是:
if (b = (true | (b = false))
在这些情况下,false
到b
的分配会在分配true
到b
之前发生 ...所以{{ 1}}最终成为b
。在所有其他情况下,分配以相反的顺序发生。