[英]Why does this not short circuit?
public static void main(String args[]){
String s = null;
if(false && false || s.equalsIgnoreCase("x")) { //throws an exception
System.out.println("true");
} else {
System.out.println("false");
}
}
我原以為這會遇到短路故障,但事實並非如此。 這是為什么? 我假設如果您有錯誤,則無需繼續下一個&&。 請幫助我理解。
因為這:
a && b || c
等效於此:
(a && b) || c
||
的lhs 為假,因此對c
求值。
&&
運算符的優先級高於||
操作員 。 因此,條件等於
if( (false && false) || s.equalsIgnoreCase("x")) { //throws an exception
然后評估離開:
if(false || s.equalsIgnoreCase("x")) { //throws an exception
這不會短路。 要使其短路,請使用括號:
if(false && (false || s.equalsIgnoreCase("x"))) { // fine
和具有較高的優先級,因此將其括起來
((false && false) || s.equalsIgnoreCase("x"))
(false && false)
減少為false
,不會因||
短路 。
值得記住的是, &
有點像*
( 1 & 1 = 1
和0 * 1 = 1
),而+
有點像|
因此&
具有更高的優先級。 在數學中,有時+
用作or,而&
和*
。 邏輯運算的優先級與二進制運算的優先級相同,因此&&
優先級高於||
。
為什么要短路? || 僅當LH操作數為true時才短路。 如果LH操作數為false,則&&短路。 在這里,您有一個短路&&和一個非短路||。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.