短路操作人员是否过载



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

对于布尔型

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任务?

您可以在这里找到答案:

当a,^,或|运算符的类型为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

我不知道询问它是否过载是什么意思,因为因为它可以用于不同的类型,所以它是过载的。

我不完全确定你在问什么,但至少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

相关内容

  • 没有找到相关文章

最新更新