请查看以下代码:
int i=5;
boolean b = i<5 && ++i<5;//line 2
System.out.println(i);//line 3, prints 5
在第2行中,根据我的理解:由于在所有运算符中,++具有最高优先级++i
应该首先进行评估。但line 3
实际上是在打印i=5
(而不是6
)。含义,&amp;&amp;在++运算符之前已经评估过这怎么可能?
编辑:从答案中我看到“在Java中,所有表达式都是从左到右进行评估。” 但实际优先顺序什么时候开始发挥。在以下代码中:
int a=1,b=1,c=1;
boolean b = a==b&&b==c;//Line2
在第2行中,代码不会从左向右运行。首先评估a == b然后b == c然后&amp;&amp;运营商。你能解释一下吗?
答案 0 :(得分:7)
这不是表达式的处理方式。
在Java中,所有表达式从左到右进行计算。 运算符优先级仅在考虑&&
的参数的评估时才会发挥作用。
因此i < 5
在++i < 5
被考虑之前计算出来。
在这种情况下,++i < 5
将 不进行评估,因为i < 5
为false
。因此i
保留在5
。
答案 1 :(得分:1)
关键是:++在表达式中具有最高优先级,但句子boolean b = i<5 && ++i<5
有两个从左到右计算的表达式。
想到b = i<5 && ++i<5
喜欢:
if( i<5 ){
if ( ++i<5 ){
return true;
}
}
答案 2 :(得分:0)
你的误解在于&#39;&amp;&amp;&#39;作品。当你使用它们时,java使用短路或懒惰评估。
database1
java评估boolean equal = 1==1 && 1==2
将其视为1==1
,检查&符号,并且必须评估true
1==2
,因此{{1}是} false
。
equal
java评估false
将其视为false,然后检查&符号,可以看到下一个表达式是true还是false,结果是否相同,boolean equal = 1==2 && 1==1
是1==2
。因此,它永远不会评估第二个等式。
更明显地,第二个例子是equal
。只有两者都是真的,这才是真的。因此,知道第一个是错误的是我们需要知道的结果。通过忽略此时的sencond表达式,我们可以节省不必要的计算。
答案 3 :(得分:0)
考虑到您编辑的答案,第二个代码段也会从左到右进行评估。
在这两种情况下都有A && B
形式的表达式,其中A
为左参数,B
为&&
的正确参数。
这里是&#34;从左到右&#34;适用。首先,评估左表达式A
。在您的第一个代码段中,即i<5
,并且由于此表达式的计算结果为false
,因此整个表达式将计算为false
(短路)。
在你的第二个片段中,你有左参数a==b
。由于该计算结果为true
,因此仅考虑第二个参数,该参数的计算结果为true
。这样您就可以true && true
,然后可以进一步处理。