下面描述了一个简单的 Java 表达式。基于Operator Precedence table ,我希望这个表达式会返回被零除的异常(因为修复后增量运算符具有最高优先级)并期望结果表达式看起来像:
2 + 2 + 5 / 0
但结果是 7,为什么? (通过一些实验,我发现出于某种原因,所有运算符都被赋予了 1 的值,但如果优先级表是正确的,这对我来说没有意义)
int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7
最佳答案
运算符优先级不控制求值顺序。它仅控制表达式的读取方式。例如,由于乘法的优先级高于加法,x + y * z
被读作 x + (y * z)
,而不是 (x + y ) * z
。但是,这并没有改变,首先评估 x
,然后评估 y
,最后评估 z
。
用 ++
和 --
给出一个很好的例子比较困难,因为通常只有一种读法是有意义的。但是,您可能会注意到 y - x++
编译没有错误(如果 x
和 y
是数值变量)。如果 ++
的优先级低于 -
,它将被评估为 (x - y)++
,这将无法编译。
由于运算符优先级,您的表达式被评估为:
(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));
但评估顺序并没有被它改变。
关于Java 后增量和前增量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397225/