[英]Logical operator precedence in Java
我對此並不滿意: http : //docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22 。 它清楚地說明了以下內容:
“如果操作數表達式沒有副作用,則每個運算符都是可交換的。”
和
“這些運算符具有不同的優先級,具有最高優先級和最低優先級”。
為什么JVM不符合它自己的規則。 以下面的例子為例。
public static void main(String[] args){
boolean bool = isTrue1() | isFalse1() & isFalse2() ;
System.out.println("Result : " + bool);
}
public static boolean isFalse1() {
System.out.println("1 : " + false);
return false ;
}
public static boolean isFalse2() {
System.out.println("2 : " + false);
return false ;
}
public static boolean isTrue1() {
System.out.println("3 : " + true);
return true ;
}
結果是:
3 : true
1 : false
2 : false
Result : true
實際結果應該是,根據&之前評估&運算符的事實 運營商:
1 : false
2 : false
3 : true
Result : true
一些解釋很好,為什么這沒有正確實現。 即使在第二部分周圍添加括號,也不會使用正確的優先級。
“這些運算符具有不同的優先級,具有最高優先級和最低優先級”。
僅僅因為它們具有更高的優先級,並不意味着它們的操作數將首先被評估。
這個
boolean bool = isTrue1() | isFalse1() & isFalse2() ;
變得等同於
boolean bool = isTrue1() | ( isFalse1() & isFalse2() ) ;
這都是優先權。
正如Java語言規范所述, 操作員操作數從左到右進行評估。
Java編程語言保證運算符的操作數似乎以特定的評估順序進行評估,即從左到右。
&優先級高於| 但在你的情況下,評估這個:
boolean bool = isTrue1() | isFalse1() & isFalse2()
與評估此相同:
boolean bool = (isTrue1()) | (isFalse1() & isFalse2())
這意味着,|的兩面 表達式是相同的優先級。 因此,在這種情況下,java將以從左到右的順序對它們進行評估。
首先,它將調用isTrue1(),它是左邊的第一個,然后是第二個paranthesis,再次按從左到右的順序評估其中的內容:isFalse1()然后是isFalse2()。
方法評估的順序不一定與運算符優先級匹配; 每種方法的副作用都按照您調用方法的順序顯示,然后評估它們的結果以生成最終的print語句。
你在這里做的是一個按位組合而不是邏輯操作。 所以Java按照人們的預期遵循從左到右的順序。
如果您實際使用邏輯運算(用||和&替換&|),結果將變為:
1 : true
Result : true
Java會在比較結果之前調用所有函數,因為你使用的是二進制比較器(&和|)而不是邏輯比較器(&&和||)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.