【发布时间】:2016-07-29 13:42:29
【问题描述】:
public class Test {
public static void main(String[] args) {
int x = 3;
int y = ++x * 5 * x--;
System.out.println("x is " + x);
System.out.println("y is " + y);
}
}
输出是:
x is 3
y is 80
但是使用后运算符优先于前运算符的规则,不应该是这样的吗:
y = ++x * 5 * 3 (x is 2)
y = 3 * 5 * 3 (x is 3)
y = 45
相反,这段代码的行为就像它只是从左到右计算表达式,在后减之前计算前增量。为什么?
【问题讨论】:
-
我倾向于将优先级视为添加括号。您在此处显示的代码并未说明这些运算符之间的优先级。它实际上是 ((++x) * 5) * (x--),对于每个二元运算符,首先计算 LHS。
-
使用后运算符优先于前运算符的规则,没有这样的规则。解释输出的唯一规则是每个表达式的从左到右求值。
-
@JonSkeet 谢谢!现在我明白了。
-
@Tunaki:Java 教程确实 具有这种优先级,这有点令人困惑:docs.oracle.com/javase/tutorial/java/nutsandbolts/… 这是一个措辞不佳的页面 IMO。
-
您可能正在阅读 Boyarsky 的 OCA 教科书,因为我偶然发现了完全相同的问题!事实证明,在网上搜索了一下之后,“Java 语言规范中没有明确的运算符优先级表。网上和教科书中的不同表在一些小方面存在分歧。”链接:introcs.cs.princeton.edu/java/11precedence 我确实信任 Priceton,但我仍然有些疑问 :) 我会重新提出这个问题,但我没有特权 :)