Java 后增量和前增量行为

标签 java postfix-operator prefix-operator

下面描述了一个简单的 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++ 编译没有错误(如果 xy 是数值变量)。如果 ++ 的优先级低于 -,它将被评估为 (x - y)++,这将无法编译。

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

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

但评估顺序并没有被它改变。

关于Java 后增量和前增量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397225/

相关文章:

java - JSpinner 与其他 swing 组件有何不同?

c++ - 为什么 C++ 接受一个变量的多个前缀而不是后缀

c - c中前缀和后缀运算符的操作

c - 下面的C程序的输出结果如何解释?

java - 如何使用 Mockito 比较 Junit 测试用例中的多个条件

java - 如何不更改方法中的对象

java - 两个日期之间的天数值错误

c++ - 即使后缀和赋值都重载,运算符重载也不起作用

java - 前缀和后缀运算符java

javascript - "!--"在 JavaScript 中做了什么?