2013-06-27 23 views
4

有使用位運算符的兩種情況:短路操作是否過載?

對於布爾

boolean a = true; 
boolean b= false; 
boolean c = a|b; // Giving response after logical OR for booleans. 

對於整數

int a = 10; 
int b = 20; 
int c = a|b; // Giving response after bitwise OR for boolean equivalents of "a" and "b". 

上述兩種情況都是在http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2順應性。

是運營商|重載?

我只是打算問一個很簡單的問題:是「|」重載或執行相同的任務按比例或兩個布爾值(當然二進制等值)和整數?

+1

什麼會按位和邏輯或爲一的區別'boolean'? – millimoose

+0

另外我不確定你在問。 '|'重載?很明顯,它可以應用於不同的操作數類型,但您在問題中的含義非常多。你問這兩者之間的區別是什麼?那麼你有JLS打開,所以它就在那裏,但'|'不是短路。你在問'如何對'布爾值'進行按位或運算?對於代表一位的數據類型來說,這種區分是沒有意義的。 – millimoose

+0

爲什麼不對布爾值進行按位操作是有道理的?布爾值肯定會有一些二進制等值,並且按位或者可能會爲我們提供所需的結果。 – Amber

回答

2

我不能完全確定你的要求,但至少字節碼boolean c = a|bboolean c = a||b之間是不同的:

boolean a = true; 
boolean b = false; 
boolean c = a|b; 

ILOAD 1 
ILOAD 2 
IOR 
ISTORE 3 
boolean c = a||b; 

ILOAD 1 
IFNE L4 
ILOAD 2 
IFNE L4 
ICONST_0 

所以這兩家運營商有效地導致字節碼級別的不同操作。最具體地,||只判斷第二個操作數,如果第一操作數是false,而|評估在任何情況下,兩個操作數:

public boolean a() { 
    System.out.println(" a"); 
    return true; 
} 

public boolean b() { 
    System.out.println(" b"); 
    return false; 
} 

public void c() { 
    System.out.println("a() | b()"); 
    boolean r1 = a() | b(); 
    System.out.println("\na() || b()"); 
    boolean r2 = a() || b(); 
} 

輸出:

​​

與此同時,字節碼爲整數按位或相同布爾按位或:

int a1 = 10; 
int a2 = 20; 
int c1 = a1 | a2; 
ILOAD 4 
ILOAD 5 
IOR 
ISTORE 6 
+0

我檢查了它們的字節碼,並且不清楚它們發生了什麼。 – Amber

+1

有效地,'|'產生一個'IOR'操作碼,它計算一個按位或' - '而'||'產生'IFNE'操作碼,照顧快捷方式。如果你特別要求快捷方式:'||'計算兩個表達式,而'|'只計算第一個表達式的第二個表達式爲'false'(因此如果可能,使用跳過第二個運算符的分支操作碼)。 –

4

你可能會找到答案here

當兩個操作數一&,^或|運算符是布爾類型或 布爾值,那麼按位運算符表達式的類型是布爾值。 在所有情況下,操作數受到(§5.1.8) 根據需要取消裝箱轉換。

如果使用|操作上boolean,那麼結果會是這樣使用||但要注意,不同的是在的情況下:

boolean a = true, b = false; 
boolean c = a | b; //b will still be evaluated 
c = a || b;  //b will not be evaluated 

我不知道什麼意思用詢問是否過載,因爲它可以用於不同的類型,所以過載。