2013-06-27 22 views
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顺应性。

是运营商|重载?

我只是打算问一个很简单的问题:是“|”重载或执行相同的任务按比例或两个布尔值(当然二进制等值)和整数?

+1

什么会按位和逻辑或为一的区别'boolean'? – millimoose

+0

另外我不确定你在问。 '|'重载?很明显,它可以应用于不同的操作数类型,但您在问题中的含义非常多。你问这两者之间的区别是什么?那么你有JLS打开,所以它就在那里,但'|'不是短路。你在问'如何对'布尔值'进行按位或运算?对于代表一位的数据类型来说,这种区分是没有意义的。 – millimoose

+0

为什么不对布尔值进行按位操作是有道理的?布尔值肯定会有一些二进制等值,并且按位或者可能会为我们提供所需的结果。 – Amber

回答

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(); 
} 

输出:

​​

与此同时,字节码为整数按位或相同布尔按位或:

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

我检查了它们的字节码,并且不清楚它们发生了什么。 – Amber

+1

有效地,'|'产生一个'IOR'操作码,它计算一个按位或' - '而'||'产生'IFNE'操作码,照顾快捷方式。如果你特别要求快捷方式:'||'计算两个表达式,而'|'只计算第一个表达式的第二个表达式为'false'(因此如果可能,使用跳过第二个运算符的分支操作码)。 –

4

你可能会找到答案here

当两个操作数一&,^或|运算符是布尔类型或 布尔值,那么按位运算符表达式的类型是布尔值。 在所有情况下,操作数受到(§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 

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