通过Java操作符优先级表:
逻辑OR运算符比‘&’逻辑运算符具有更高的优先级。
我使用以下代码检查了上述事实
int y = 5;
int x = 2;
if( x++ > 2 && ++y > 2 | true )
; //do nothing
System.out.println("x = " + x + " y = " + y);但在线上,输出值为-
x = 3 y = 5显示x++首先进行评估。
就连我都把括号放在了x附近
if( x++ > 2 && (++y > 2 | true) )
;但我还是得到了同样的输出。
为什么运算符优先在这种情况下不起作用?
发布于 2013-05-28 05:22:41
这不是逻辑操作符。那是位操作符。它将评估一切-也就是说,它不会短路-如果有任何东西翻转到1,它将保持在1,直到否定。
以下是这些声明的评估方法:
x++ > 2 && ++y > 2 || true -> true.我们在逻辑上失败了,但逻辑或成功了。通过短路,我们不会继续计算逻辑的任何部分,因为x > 2是假的。x++ > 2 && (++y > 2 || true) -> false,因为x > 2不是真的,所以我们会走捷径.如果您实际上不希望短路行为,那么使用按位,以及,您将得到您的预期评估块。
x++ > 2 & ++y > 2 | true仍将计算为true,但x和y的值将分别更改为3和6。
发布于 2013-05-28 05:22:16
|是按位或运算符。你在找||。它类似,但不同之处在于它具有更高的优先级,不适用短路评估。
我明白你现在的真正要求了。您可能想知道,如果&&的优先级最小,那么在最终进入它之前,不会对语句的其余部分进行评估。所以在
x++ > 2 && ++y > 2 | true 它应该评估x++ > 2,然后是++y > 2 | true,最后应用&&。好吧,答案是&&采用短路评估。当然,它可以评估一切,然后应用它的效果,这就是按位运算符所做的。但这并不是因为
if (a && b && ...)应该表现得类似于
if (a) {
if (b) {
...
}
}运算符优先级与您预期的一样,但是,由于运算符的属性,计算结果提前终止。所以回到
x++ > 2 && ++y > 2 | true 我们看到x++ > 2是假的,因此不计算++y > 2 | true。
发布于 2013-05-28 05:22:43
尝尝这个
if( x++ > 2 && ++y > 2 || true )您使用的是bitwise运算符,而不是logical运算符。
Operators in java
https://stackoverflow.com/questions/16784386
复制相似问题