确定运营商的运营顺序

时间:2016-10-04 16:28:21

标签: java operator-precedence

在决定运营商的运营顺序时,我对以下两条声明感到困惑。

  1. 声明将从左到右执行。
  2. 将根据运营商的优先顺序执行。
  3. 以下代码从左到右执行

    session_start

    但是下面的代码似乎遵循优先顺序:

    int i=5;    
    boolean b = i<5 && ++i<5;//line2
    System.out.println(i);//prints 5
    //left to right execution in line2.
    //< is executed and ++ is not.Even though ++ has higher precedence.
    

    我已经部分问了这个问题here,但没有得到足够好的解释。 请有人澄清一下吗?

3 个答案:

答案 0 :(得分:0)

作业从右到左排列。在您的情况下,boolean b将被分配给右侧的表达式评估为:

a==b&&b==c

请注意,赋值运算符在优先级方面具有与逻辑/位运算符不同的规则(即===&&具有相同的优先级。< / p>

答案 1 :(得分:0)

我认为您需要了解逻辑AND和OR。

something && somethingElse - 想象一下这个表达。只有两个值都为真,它才会返回true。如果两者都是假的,或者其中一个是假的 - 返回false。所以,让我们说第一部分实际上是假的(something=false)。就像我说的那样,如果这个表达中的任何内容都是假的,那么就没有必要进一步了,因为无论第二个是什么,它都会返回假。这就是为什么在你的第一个例子中它没有进一步 - 没有必要,i已经不低于5所以没有理由检查第二部分,因为它已经是假的了。

在你的第二个例子中a==b是真的,但我们已经无法返回true,我们需要检查第二个,因为就像我说的那样,如果第二个是假的那么它必须返回假。所以表达式需要进一步检查第二部分。不像我们可以停止的第一个例子,这里我们需要继续检查。

当谈到OR(||)时,规则是不同的。只有一个部分需要是真实的(这就是为什么它被称为或者,这个或那个,并不重要,一个事实就足够了)。所以对于||,如果第一部分是真的,我们可以无论如何返回,但如果第一部分是假的,那么无论如何我们都需要继续前进,因为第二部分可能是真的。

答案 2 :(得分:0)

i<5 && ++i<5;//line2
  1. &安培;&安培;
  2. [&amp;&amp;] eval LHS:i&lt; 5 to false
  3. [&amp;&amp;]跳过RHS:++ i&lt; 5并且产生错误
  4. 和 // line2:(a == b)&amp;&amp;(b == c)

    a==b&&b==c;
    
    1. &安培;&安培;
    2. [&amp;&amp;] eval LHS:a == b to true
    3. [&amp;&amp;] eval RHS:b == c to true,yield true
    4. &&是一个快捷操作符,不评估右侧。

      优先级对于二元运算符很重要。一元运算符的优先级不能重新排序任何东西,但传统上它具有更高的优先级,因为它更紧密地绑定到最终值,特别是对于后缀运算符。

      前缀运算符++具有重要特征,即在评估应用它的术语之前调用它。

      不言而喻,上面的用法是可以拍摄的,悬挂在最近的AVL树上,分层和羽毛并在城外追逐。