簡體   English   中英

Java中的邏輯運算符優先級

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM