Java post-增量和预增量行为
Java post-increment and pre increment behaviour
我有一个简单的 Java 表达式,如下所示。基于 Operator Precedence table,我希望这个表达式会 return 除以零异常(因为 post-fix 增量运算符具有最高优先级)并期望结果表达式看起来像:
2 + 2 + 5 / 0
但是结果是7,为什么? (通过一些实验,我发现出于某种原因,所有运算符都被赋予了 1 的值,但是如果优先级 table 是正确的,这对我来说没有意义)
int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7
表达式从左到右求值:
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
1 + 1 + 5 / 1 = 7
请注意,运算符是按您期望的顺序求值的,即 1 + 1 + (5/1) = 1 + 1 + 5 = 7
,但所有这些表达式的操作数都是从左到右求值的。
求值顺序是从左到右,而不是从右到左。所以你得到的结果 7 是正确的。
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
实际上是
unaryOperand = 1 + 1 + 5 / 1; = 7
运算符优先级不控制计算顺序。它仅控制表达式的读取方式。例如,由于乘法的优先级高于加法,因此 x + y * z
被读作 x + (y * z)
,而不是 (x + y) * z
。但是,首先评估 x
,然后评估 y
,最后评估 z
.
并没有改变
用++
和--
给出一个很好的例子比较困难,因为通常只有一种读法是有意义的。但是,您可能会注意到 y - x++
编译没有错误(如果 x
和 y
是数值变量)。如果 ++
的优先级低于 -
,它将被评估为 (x - y)++
,无法编译。
由于运算符优先级,您的表达式被计算为:
(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));
但评估顺序并没有被它改变。
我有一个简单的 Java 表达式,如下所示。基于 Operator Precedence table,我希望这个表达式会 return 除以零异常(因为 post-fix 增量运算符具有最高优先级)并期望结果表达式看起来像:
2 + 2 + 5 / 0
但是结果是7,为什么? (通过一些实验,我发现出于某种原因,所有运算符都被赋予了 1 的值,但是如果优先级 table 是正确的,这对我来说没有意义)
int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7
表达式从左到右求值:
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
1 + 1 + 5 / 1 = 7
请注意,运算符是按您期望的顺序求值的,即 1 + 1 + (5/1) = 1 + 1 + 5 = 7
,但所有这些表达式的操作数都是从左到右求值的。
求值顺序是从左到右,而不是从右到左。所以你得到的结果 7 是正确的。
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
实际上是
unaryOperand = 1 + 1 + 5 / 1; = 7
运算符优先级不控制计算顺序。它仅控制表达式的读取方式。例如,由于乘法的优先级高于加法,因此 x + y * z
被读作 x + (y * z)
,而不是 (x + y) * z
。但是,首先评估 x
,然后评估 y
,最后评估 z
.
用++
和--
给出一个很好的例子比较困难,因为通常只有一种读法是有意义的。但是,您可能会注意到 y - x++
编译没有错误(如果 x
和 y
是数值变量)。如果 ++
的优先级低于 -
,它将被评估为 (x - y)++
,无法编译。
由于运算符优先级,您的表达式被计算为:
(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));
但评估顺序并没有被它改变。