一尘不染

为什么这里没有遵循运算符优先级?

java

在此代码中:

int y = 10;
int z = (++y * (y++ + 5));

我所期望的

y++ + 5由于最里面的括号的优先级,将执行First 。因此,值y将为11,此表达式的值将为15。然后++y * ()将被执行。所以12 * 15 =180。所以z = 180

我得到了什么

z = 176

这意味着VM从左到右不遵循操作员优先级。那么我对运算符优先级的理解是错误的吗?


阅读 179

收藏
2020-12-03

共1个答案

一尘不染

表达式( y *(y + 5)); 将被放置在这样的堆栈中:

1. [++y]
2. [operation: *]
3. [y++ + 5] // grouped because of the parenthesis

结果将按照该顺序执行

1. 10+1 = [11] // y incremented 
2. [operation: *]
3. 11+5 = [16] // y will only increment after this operation

该表达式的计算方式为

11 * 16 = 176
2020-12-03