4

ビット単位の演算子を使用するケースは 2 つあります。

ブール値の場合

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に準拠しています。

演算子です| 過負荷?

非常に簡単な質問をしたいだけです: Is "|" オーバーロードされているか、ブール値 (もちろんバイナリに相当) と整数の両方に対してビットごとの OR の同じタスクを実行しますか?

4

2 に答える 2

4

ここで答えが見つかるかもしれません:

&、^、または | の両方のオペランドが operator が boolean または Boolean 型である場合、ビットごとの演算子式の型は boolean です。いずれの場合も、オペランドは必要に応じてボックス化解除変換(§5.1.8)の対象となります 。

|演算子 onを使用するbooleanと、結果は using のようになりますが||、違いは次の場合にあることに注意してください。

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

さまざまな型で使用できるため、オーバーロードされているため、オーバーロードされているかどうかを尋ねることの意味がわかりません。

于 2013-06-27T07:59:53.580 に答える
2

あなたが何を求めているのか完全にはわかりませんが、少なくともバイトコードは と の間で異なりboolean c = a|bますboolean 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

したがって、この 2 つの演算子は、事実上、バイトコード レベルで異なる操作になります。最も具体的に||は、最初のオペランドが の場合にのみ 2 番目のオペランド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

同時に、整数のビットごとの or のバイトコードは、ブール値のビットごとの or と同じです。

int a1 = 10;
int a2 = 20;
int c1 = a1 | a2;
ILOAD 4
ILOAD 5
IOR
ISTORE 6
于 2013-06-27T07:59:34.773 に答える