2016-10-04 138 views
0

决定操作员的操作顺序时,我很困惑以下两个说法。确定操作员的操作顺序

  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但我以前不得到很好的足够的解释。 有人可以澄清?

+0

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

回答

0

作业从右向左进行。在你的情况下,boolean b将被分配到任何右边的表达式计算结果为:

a==b&&b==c 

注意赋值运算符在优先级上都比逻辑/位运算符不同的规则(即=不具备与==&&相同的优先权)。

0

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

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

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

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

0
i<5 && ++i<5;//line2 
  1. & &
  2. [& &] EVAL LHS:ⅰ< 5至假
  3. [& &跳到RHS:++我< 5和产生假

和 // line2:(a == b)& &(B == c)中

a==b&&b==c; 
  1. & &
  2. [& &] EVAL LHS:一个== b键真
  3. [& &] EVAL RHS:乙== c键真实,产量真实

&&是一个快捷操作rator不评估右侧。

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

前缀运营商++具有重要的特点,即它应用了任期评价之前,它被调用。

不用说,上面的使用是值得被枪杀了,挂在最近AVL树,分层和羽毛被赶出城。