3

我有一个简单的 Java 表达式,如下所示。基于Operator Precedence table,我希望这个表达式将返回除以零异常(因为后置增量运算符具有最高优先级)并期望结果表达式如下所示:

2 + 2 + 5 / 0

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

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

3 回答 3

2

表达式从左到右计算:

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

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

于 2015-12-21T13:50:42.987 回答
2

运算符优先级不控制评估顺序。它仅控制如何读取表达式。例如,由于乘法的优先级高于加法,x + y * z因此读作x + (y * z),而不是(x + y) * zx但是,先评估,然后再评估,y这并没有改变z

++用and举一个很好的例子--比较困难,因为通常只有一种读法是有意义的。但是,您可能会注意到y - x++编译时没有错误(如果xy是数值变量)。If++的优先级低于-它将被评估为(x - y)++which 不会编译。

由于运算符优先级,您的表达式被评估为:

(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));

但评估顺序不会被它改变。

于 2015-12-21T14:01:10.147 回答
1

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

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

实际上是

unaryOperand = 1 + 1 + 5 / 1; = 7
于 2015-12-21T13:50:50.093 回答