Java后增量和预增量行为

时间:2015-12-21 13:47:58

标签: java postfix-operator prefix-operator

我有一个简单的Java表达式,如下所示。基于Operator Precedence table,我希望这个表达式会返回除零异常(因为post-fix increment运算符具有最高优先级)并且期望得到的表达式看起来像:

2 + 2 + 5 / 0

但结果是7,为什么? (通过一些实验我发现所有运算符由于某种原因被赋值为1,但是如果优先级表是正确的话,这对我没有意义)

int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7

3 个答案:

答案 0 :(得分:2)

表达式从左到右进行评估:

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
                        1         +          1       + 5 / 1                    = 7

请注意,运算符按您期望的顺序进行求值,即1 + 1 + (5/1) = 1 + 1 + 5 = 7,但所有这些表达式的操作数都是从左到右计算的。

答案 1 :(得分:2)

运算符优先级不控制评估顺序。它仅控制表达式的读取方式。例如,由于乘法的优先级高于加法,因此tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){ @Override public void onTabSelected(TabLayout.Tab tab) { pager.setCurrentItem(tab.getPosition()); } }); 读取为x + y * z,而不是x + (y * z)。但是,它不会更改首先评估的(x + y) * z,然后是x,最后是y

z++提供一个好例子比较困难,因为通常只有一个读数有意义。但是,您可能会注意到--编译时没有错误(如果y - x++x是数字变量)。如果y的优先级低于++,则会将其评估为无法编译的-

由于运算符优先级,表达式的计算结果为:

(x - y)++

但评估顺序不会因此而改变。

答案 2 :(得分:1)

评估顺序是从左到右,而不是从右到左。所以你得到的结果7是正确的。

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;

实际上是

unaryOperand = 1 + 1 + 5 / 1; = 7