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

是运营商| 超载?

我只是想问一个非常简单的问题:是“|” 重载或它对布尔值(当然是二进制等价物)和整数执行相同的按位或任务?

4

2 回答 2

4

您可能会在这里找到答案:

当 &、^ 或 | 的两个操作数 运算符的类型为 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

我不完全确定你在问什么,但至少字节码在 and 之间是不同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
于 2013-06-27T07:59:34.773 回答