短路运营商是否超载?

时间:2013-06-27 07:53:50

标签: java or-operator

使用按位运算符有两种情况:

对于布尔值

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

运营商 | 是否已超载?

我只是想问一个非常简单的问题:是“|”对于两个布尔值(当然是二进制当量)和整数?

,它是否重载或执行相同的按位OR任务

2 个答案:

答案 0 :(得分:4)

您可能会找到答案here

  

当&,^或|的两个操作数时运算符的类型为boolean或   布尔值,然后按位运算符表达式的类型是布尔值。   在所有情况下,操作数都需要进行拆箱转换(§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

我不确定它是否意味着它是否过载,因为它可以在不同的类型上使用,它会被重载。

答案 1 :(得分: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();
}

输出:

a() | b()
   a
   b

a() || b()
   a

同时,整数按位的字节码或与布尔按位或:

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