为什么这里不遵循运算符优先级?
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 从左到右不遵循操作员优先级。那么我对运算符优先级的理解是错误的吗?
在此代码中:
int y = 10;
int z = (++y * (y++ + 5));
我的期望
第一个将执行,因为最内侧的括号优先。因此,的值将为 11,此表达式的值将为 15。然后将被执行。所以12 * 15 = 180。所以 z=180y++ + 5y++y * ()
我得到了什么
z = 176
这意味着 VM 从左到右不遵循操作员优先级。那么我对运算符优先级的理解是错误的吗?
表达式 (++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
第一个 y++ + 5 将执行,因为最内侧括号的优先级
优先级和评估顺序不是一回事。除赋值表达式之外的所有二进制表达式都是从左到右计算的。因此,在右侧的括号表达式之前计算。y++