短路和一元操作员的工作

时间:2016-10-04 12:18:02

标签: java operator-precedence

请查看以下代码:

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;运营商。你能解释一下吗?

4 个答案:

答案 0 :(得分:7)

这不是表达式的处理方式。

在Java中,所有表达式从左到右进行计算。 运算符优先级仅在考虑&&参数的评估时才会发挥作用。

因此i < 5++i < 5被考虑之前计算出来。

在这种情况下,++i < 5 进行评估,因为i < 5false。因此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==11==2。因此,它永远不会评估第二个等式。

更明显地,第二个例子是equal。只有两者都是真的,这才是真的。因此,知道第一个是错误的是我们需要知道的结果。通过忽略此时的sencond表达式,我们可以节省不必要的计算。

答案 3 :(得分:0)

考虑到您编辑的答案,第二个代码段也会从左到右进行评估。

在这两种情况下都有A && B形式的表达式,其中A为左参数,B&&的正确参数。

这里是&#34;从左到右&#34;适用。首先,评估左表达式A。在您的第一个代码段中,即i<5,并且由于此表达式的计算结果为false,因此整个表达式将计算为false (短路)。

在你的第二个片段中,你有左参数a==b。由于该计算结果为true,因此仅考虑第二个参数,该参数的计算结果为true。这样您就可以true && true,然后可以进一步处理。