&&
从左至右评估短路操作,因此,如果在左侧的操作&&
运营进行评估,以虚假的,评估应该不会继续.但我++
之前应该评估&&
它,因为它具有更高的优先级,并且(来自链接):
优先级较高的运算符在优先级相对较低的运算符之前进行求值.
在这种情况下,为什么不在count
这段代码的第三行增加?
int mask = 2; int count = 0; if( !(mask > 1) && ++count > 1) { mask += 100; } System.out.println(mask + " " + count);
Martijn Cour.. 6
不,表达式的计算方式从左到右,同时考虑运算符优先级.因此,一旦在 a && b
该a
变假,b
不再被评估.
JLS§15.23.条件和运算符&&说:
条件和运算符
&&
类似于&
(§15.22.2),但只有在其左侧操作数的值为真时才计算其右侧操作数.
以下是对其工作原理的详细分步评估:
这是因为,当您将表达式解析为人类时,首先从最低优先级运算符开始.在这种情况&&
下,优先级较低++
.
++a < 0 && foo ^^ start
为了计算结果&&
,你应该知道左操作数:
++a < 0 && ++b ^^^^^^^ so compute this
现在,当你想知道结果时++a < 0
,首先看看最低优先级运算符,即<
:
++a < 0 ^ evaluate this
为此,您需要左右操作数.所以计算它们:
++a 0
这是++a
增加的时刻.
所以,现在我们处于底层.让我们回到顶端:
false && foo
这就是&&短路的事实.左操作数是假的,因此foo
不再评估右操作数表达式.哪个成了:
false
没有评估右操作数.
不,表达式的计算方式从左到右,同时考虑运算符优先级.因此,一旦在 a && b
该a
变假,b
不再被评估.
JLS§15.23.条件和运算符&&说:
条件和运算符
&&
类似于&
(§15.22.2),但只有在其左侧操作数的值为真时才计算其右侧操作数.
以下是对其工作原理的详细分步评估:
这是因为,当您将表达式解析为人类时,首先从最低优先级运算符开始.在这种情况&&
下,优先级较低++
.
++a < 0 && foo ^^ start
为了计算结果&&
,你应该知道左操作数:
++a < 0 && ++b ^^^^^^^ so compute this
现在,当你想知道结果时++a < 0
,首先看看最低优先级运算符,即<
:
++a < 0 ^ evaluate this
为此,您需要左右操作数.所以计算它们:
++a 0
这是++a
增加的时刻.
所以,现在我们处于底层.让我们回到顶端:
false && foo
这就是&&短路的事实.左操作数是假的,因此foo
不再评估右操作数表达式.哪个成了:
false
没有评估右操作数.