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

2022-09-02 00:25:58

在此代码中:

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

我的期望

第一个将执行,因为最内侧的括号优先。因此,的值将为 11,此表达式的值将为 15。然后将被执行。所以12 * 15 = 180。所以 z=180y++ + 5y++y * ()

我得到了什么

z = 176

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


答案 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

答案 2

第一个 y++ + 5 将执行,因为最内侧括号的优先级

优先级和评估顺序不是一回事。除赋值表达式之外的所有二进制表达式都是从左到右计算的。因此,在右侧的括号表达式之前计算。y++