【发布时间】:2012-11-05 17:35:26
【问题描述】:
我已经阅读了几个关于 java 中短路操作的教程和答案,但我仍然不太了解 java 如何处理双垂直管道与双 & 符号的短路的区别。比如……
为什么逻辑与短路评估失败?
引用 JSL 15.23。条件与运算符 &&
The conditional-and operator && is like & (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is true.
public static void main( String... args ) {
int a = 1;
int b = 2;
// Okay. Prints
if( a == 1 | b == 3 ) {
System.out.println( "Comparison via |" + "\na is " + a + "\nb is " + b );
}
// Okay. Prints
if( a == 1 || b == 3 ) {
System.out.println( "Comparison via ||" + "\na is " + a + "\nb is " + b );
}
// Okay. Does not print
if( a == 1 & b == 3 ) {
System.out.println( "Comparison via &" + "\na is " + a + "\nb is " + b );
}
// I don't understand. Shouldn't the Short Circuit succeed since the left side of the equation equals 1?
if( a == 1 && b == 3 ) {
System.out.println( "Comparison via &&" + "\na is " + a + "\nb is " + b );
}
}
【问题讨论】:
-
|和&是按位或/和运算符;它们不同于||和&&,它们是逻辑或/和运算符。 -
我知道我没有得到第四名……我迷路了:-)
-
@NullUserException:嗯,它们在短路方面是不同的——但 JLS 定义了另一个......看我的回答。 (请注意,对于
boolean操作数,它们仍然是逻辑运算符...) -
@NullUserException
|和&也是非短路逻辑或和和运算符。 -
为了让短路在 #4 中起作用,它必须使 a==1 测试失败。在这种情况下,它可以断定 && 的结果是假的,因为 false&&anything 是假的。在测试 2 中发生短路,但这不会改变结果。
标签: java evaluation logical-operators