我下面有一个简单的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++)));
但是评估顺序不会因此改变。