【问题标题】:If post-increment/decrement has precedence over pre-increment/decrement, then why is this expression evaluated like so: [duplicate]如果后增量/减量优先于前增量/减量,那么为什么这个表达式会这样评估:[重复]
【发布时间】: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,但我仍然有些疑问 :) 我会重新提出这个问题,但我没有特权 :)

标签: java operator-precedence


【解决方案1】:
int y = ++x * 5 * x--;

++x => Increase then evaluate => x == 4
x-- => Evaluate then decrease

所以实际上它看起来像这样:

int y = 4 * 5 * 4; // == 80

并且由于减量运算符,您的 x 最后是 3

【讨论】:

  • 您在后减量之前进行预增量。那么,当人们说后运算符的优先级高于前运算符时,这是什么意思?
  • @JohnPeterThompsonGarcés 他们的意思是后运算符比前运算符“绑定得更紧密”,因此在确定哪些运算符适用于相同的操作数时,它们首先应用。例如,在--x++ 中,++ 绑定更紧密,表达式实际上是--(x++)(尽管它不能编译)。在您的示例中,操作数是不同的(尽管它们都写为x,但它们可能代表不同的值),因此前置运算符和后置运算符之间的优先级并不重要。
【解决方案2】:

您的问题是y = ++x * 5 * 3 (x is 2) 它不是(4)*5*3 它是(4)*5*4。我的朋友彭达斯

    int x = 3;
    int y = ++x * 5 * x--;  //x becomes 4 , then its 4*5*4 =80 = y
    System.out.println("x is " + x); // x-- comes into affect and x = 3
    System.out.println("y is " + y);  // y = 80

虽然 x-- 在 x++ 和其他所有内容之前被评估。它会在计算整个表达式后更改 x 的值。与 ++x 在评估时不同,它会立即更改 x 的值。

【讨论】:

  • 在我看来,你根本没有真正解释过……
  • @JonSkeet 更好,抱歉缺乏评价?
  • 不是真的,你错过了问题的重点——这是 OP 声明后运算符的优先级高于前运算符(例如,根据docs.oracle.com/javase/tutorial/java/nutsandbolts/…) -你的回答根本没有解决这个问题。
猜你喜欢
  • 2013-08-11
  • 2015-05-21
  • 2018-06-29
  • 1970-01-01
  • 2019-12-05
  • 2011-05-11
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多