【发布时间】:2019-08-03 15:21:36
【问题描述】:
我有一个测验中的操作顺序问题,但解释并不完全有帮助。代码如下:
package com.udayan.oca;
public class Test {
public static void main(String [] args) {
int a = 2;
boolean res = false;
res = a++ == 2 || --a == 2 && --a == 2;
System.out.println(a);
}
}
它说它打印了 3 ,因为我测试了它,但我不明白如何。这是他们的解释:
a++ == 2 || --a == 2 && --a == 2;
[给定表达式]。 (a++) == 2 || --a == 2 && --a == 2;
[后缀的优先级高于其他运算符]。
(a++) == 2 || (--a) == 2 && (--a) == 2;
[后缀之后,前缀优先]。
((a++) == 2) || ((--a) == 2) && ((--a) == 2);
[== 优先于 && 和 ||]。
((a++) == 2) || (((--a) == 2) && ((--a) == 2));
[&& 优先于 ||]。
让我们开始解决它:((a++) == 2) || (((--a) == 2) && ((--a) == 2));
[a=2, res=false]。
(2 == 2) || (((--a) == 2) && ((--a) == 2));
[a=3, res=false]。 true || (((--a) == 2) && ((--a) == 2));
[a=3, res=false]。
||是一个短路运算符,因此不需要计算右边的表达式。
res 为真,a 为 3。
是的,顺便说一下,我理解短路,所以不需要解释。
不过这是我的想法:
res = a++ == 2 || --a == 2 && --a == 2 ->
(((a++) == 2) || (((--a) == 2) && ((--a) == 2))) [a = 2]
(((a++) == 2) || ((**1** == 2) && ((--a) == 2))) [a = 1]
(((a++) == 2) || (**false** && (**0** == 2))) [a = 1] //short-circuits
(((a++) == 2) || **false**) [a = 1] //short circuits
(**false**) [a = 1]
???? 另一点是答案键说先做a++然后||下一个。 a++ 是的,这是有道理的。但我认为 && 在 || 之前。
【问题讨论】:
标签: java operator-precedence short-circuiting