我下面有一个简单的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++)));

但是评估顺序不会因此改变。

10-07 15:52