我有一个简单的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
答案 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