簡體   English   中英

短路操作員過載嗎?

[英]Are short-circuit operators overloaded?

使用按位運算符有兩種情況:

對於布爾

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的要求

是運營商| 超載?

我只是想問一個非常簡單的問題:“ |” 重載還是對布爾值(當然是二進制等效項)和整數執行按位或的相同任務?

您可能會在這里找到答案:

當&,^或|的兩個操作數時 運算符的類型為布爾值或布爾值,則按位運算符表達式的類型為布爾值。 在所有情況下,操作數都根據需要進行拆箱轉換(第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

我不確定問它是否重載是什么意思,因為既然可以在不同類型上使用它,那么它就重載了。

我不確定您要問的是什么,但是至少在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();
}

輸出:

a() | b()
   a
   b

a() || b()
   a

同時,用於整數位或的字節碼與用於布爾位或的字節碼相同:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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