【问题标题】:Deciding the order in which operators will operate决定运营商的运营顺序
【发布时间】:2017-02-12 22:08:31
【问题描述】:

在决定运算符的操作顺序时,我对以下两种说法感到困惑。

  1. 语句将从左到右执行。
  2. 它将按照运算符的优先顺序执行。

以下代码从左到右执行

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.

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

int a=1,b=1,c=1;
boolean b = a==b&&b==c;//line2: (a==b)&&(b==c) 
 /*   In line2 code would not run from left to right. 
First a==b is evaluated then b==c and then && operator.*/

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

【问题讨论】:

  • 子结果从左到右进行评估。我相信这是您对上一个问题的回答

标签: java operator-precedence


【解决方案1】:
i<5 && ++i<5;//line2
  1. &&
  2. [&&] eval LHS: i
  3. [&&] 跳过 RHS:++i

并且 //line2: (a==b)&&(b==c)

a==b&&b==c;
  1. &&
  2. [&&] 评估 LHS:a==b 为真
  3. [&&] eval RHS:b==c 为真,产量为真

&amp;&amp; 是一个不计算右侧的快捷运算符。

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

前缀运算符++ 有一个重要特征,即在对其应用的术语进行评估之前调用它。

不用说,上面的用法是要被枪杀的东西,挂在最近的 AVL 树上,分层和羽毛,然后被赶出城。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      分配从右到左进行。在您的情况下,boolean b 将分配给右侧表达式的计算结果:

      a==b&&b==c
      

      请注意,赋值运算符的优先级规则不同于逻辑/位运算符(即= 的优先级与==&amp;&amp; 不同)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        相关资源
        最近更新 更多