在决定运营商的运营顺序时,我对以下两条声明感到困惑。
以下代码从左到右执行
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,但没有得到足够好的解释。 请有人澄清一下吗?
答案 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
和 // line2:(a == b)&amp;&amp;(b == c)
a==b&&b==c;
&&
是一个快捷操作符,不评估右侧。
优先级对于二元运算符很重要。一元运算符的优先级不能重新排序任何东西,但传统上它具有更高的优先级,因为它更紧密地绑定到最终值,特别是对于后缀运算符。
前缀运算符++
具有重要特征,即在评估应用它的术语之前调用它。
不言而喻,上面的用法是可以拍摄的,悬挂在最近的AVL树上,分层和羽毛并在城外追逐。