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
代表y
,t2
代表(y+=1) % 4
,t3
对于 (x-=2) / 3
.
Java always 从左到右计算它,因为 二元运算符的 关联性 +
从左到右。因此 t1
是第一个要评估的项,因此使用 y
.
的 unincremented 值进行评估
根据 Java 语言规范 Evaluate Left-Hand Operand First and Evaluate Operands before Operation
我刚刚遇到一段我觉得很有趣的代码(因为我在 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
代表y
,t2
代表(y+=1) % 4
,t3
对于 (x-=2) / 3
.
Java always 从左到右计算它,因为 二元运算符的 关联性 +
从左到右。因此 t1
是第一个要评估的项,因此使用 y
.
根据 Java 语言规范 Evaluate Left-Hand Operand First and Evaluate Operands before Operation