2015-08-24 19 views
0

Oracle Java Docs它提到& &运算符具有更高的优先于||。运营商。&&运算符真的比||更优先运营商?看看代码

请看下面的代码:

class TestLogicalOperators 
{ 
public static void main(String... args) 
{ 

    if(doFalse() || doTrue1() && doTrue2()) 
    { 
     System.out.println(true+" inside if"); 
    } 

} 

static boolean doTrue1() 
{ 
    System.out.println("doTrue1"); 
    return true; 
} 

static boolean doTrue2() 
{ 
    System.out.println("doTrue2"); 
    return true; 
} 

static boolean doFalse() 
{ 
    System.out.println("doFalse"); 
    return false; 
} 

}

输出是:
doFalse
doTrue1
doTrue2
真正内如果

现在,如果& &运算符优先于||运算符不应在doFalse()之前先评估doTrue1()和doTrue2()方法吗?

+1

运算符优先级为** not **评估顺序。这是如何解析表达式 –

回答

4

&&操作的优先级,只要表达:

doFalse() || doTrue1() && doTrue2()

...也可以被解读为:

doFalse() || (doTrue1() && doTrue2())(注意括号)。

这并不意味着&&表达式将在之前被评估,您的表达式仍然从左到右进行评估。

如果第一个操作数是true,则||运算符可以是快捷方式(即不评估第二个操作数)。

参见下例:

// no shortcut, evaluates (true && false) and returns false anyway 
System.out.println(false || true && false); 
// no shortcut, evaluates (true && true) and returns true 
System.out.println(false || true && true); 
// shortcut (see warning), evaluates true and disregards "&&" expression 
System.out.println(true || false && false); 
0

NO,通常的第一条件或操作首先被执行。如果评估为错误,则进一步检查第二个条件。 否则它不。

+0

而原因是..... –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ想添加一些东西吗? – SacJn

0

运营商&&has preference超过||但评估从左至右仍然存在,并已precedende了运营商在JLS §15.7

Java编程语言担保描述了运营商的操作数出现在一个特定的待评估评估顺序,即从左到右。

1

您错误地理解了文档。这并不意味着&&运营商将首先执行,它只是说,延伸到&&的条件优先于优先级较低的其他条件。

在你的例子中你可以注意到编译器正在从左到右检查if语句的条件。

如果我们将straigt去从左至右的条件是:(注意括号)

if((doFalse() || doTrue1()) && doTrue2()) 
{ 
    //This means either doFalse or doTrue1 would be true and doTrue2 would be true 
} 

但由于&&操作的优先级是在||操作的是正确地读取高过as

if(doFalse() || (doTrue1() && doTrue2())) 
{ 
    //This correctly means either doFalse is true or doTrue1 and doTrue2 are true 
}