Java 优先顺序

Java order of precedence

我刚刚遇到一段我觉得很有趣的代码(因为我在 2 年的编程中从未将它视为一个问题)

int x = 5;
int y = 3;
int z = y + (y+=1) % 4 + (x-=2) / 3;
System.out.println(z);

输出为4。

我想知道为什么首先评估最左边的 'y' 而不是 '(y+=1)' ,这将导致输出 5。(换句话说,为什么括号不是强制优先顺序?)

我不确定要搜索什么,因为搜索 'java order of precedence' returns 结果充其量只能显示 y++、++y 类问题或只是优先顺序的棘手示例 table.

我标记了 Java 但我已经用 C# 和 javascript 测试了它,所以这可能是编程中的普遍现象。

更新

我弄错了优先顺序和求值顺序。

article 帮助我进一步理解所提供的答案。

简而言之,括号仅适用于特定的 术语

表达式y + (y+=1) % 4 + (x-=2) / 3;可以改写为t1 + t2 + t3,其中t1代表yt2代表(y+=1) % 4t3 对于 (x-=2) / 3.

Java always 从左到右计算它,因为 二元运算符的 关联性 + 从左到右。因此 t1 是第一个要评估的项,因此使用 y.

unincremented 值进行评估

根据 Java 语言规范 Evaluate Left-Hand Operand First and Evaluate Operands before Operation