【问题标题】:Post Increment has high precedence than Pre increment but doesn't execute firstPost Increment 的优先级高于 Pre increment 但不先执行
【发布时间】:2018-08-15 16:08:46
【问题描述】:

我无法理解后增量和前增量运算符中的运算符优先级。我做了我的研究,并在 StackOverFlow 中找到了以下文章

Precedence of ++ and -- operators in Java

但它没有回答我的问题。

在下面的代码中

d = 1; System.out.println(++d * d++);

根据@Paŭlo Ebermann 的回答之一,上述表达式被评估为 ++d * d++ => (++d) * (d++) 然后从左到右进行评估,给出的答案为 2*2=4,这当然是 java 在我打印它时所说的。

我的理解是我相信表达式被评估为 ++d * d++ => (++d * (d++)) 因为 d++ 的优先级高于 ++d 给出的答案为3*1=3。

编辑:支持我的主张的另一个例子- 考虑表达式 2+3*5 ,它被评估为 (2+(3*5)) 并且评估以这种方式发生(乘法后加法)。但是考虑这个表达式 int i=1;sysout(i+i++);这里 i+i++ 必须变为 (i+(i++))。后增量必须将 i 增加 2(类似于乘法)分配给 i,这使得 2+1=3 但输出为 2。

请澄清我在此与评估顺序的优先级有关的问题

【问题讨论】:

    标签: java operators operator-keyword operator-precedence


    【解决方案1】:

    只有在操作符发生冲突时才会出现优先级。对于 3 + 7 * 9+* 都是二元运算符,因为它们都作用于同一个操作数 7。按优先顺序,等于3 + (7 * 9)

    但在您的情况 ++d * d++ 中,前置增量和后置增量是一元运算符。它们作用于不同的变量 d,没有冲突或共享一个共同的操作数。所以更高的优先级规则在这里不起作用。只需按从左到右的顺序计算即可。

    有关优先顺序和关联性以及操作数评估顺序的概念的更多详细信息,请参阅此网站。 https://introcs.cs.princeton.edu/java/11precedence/

    【讨论】:

      【解决方案2】:

      您将运算符优先级与子表达式的评估混为一谈。运算符优先级仅告诉我们如何添加缺少的括号。一旦一个表达式被完全括号括起来,这样底层的树结构就很明显了,我们就可以忘记运算符的优先级了。

      当评估一个全括号表达式时,例如 (++d) * (d++),我们从最外层的运算符开始,在这种情况下是乘法。这个最外层的运算符连接了几个子表达式,我们需要按从左到右的顺序对其求值(递归,即遵循与完整表达式相同的原则)。此时,运算符优先级不再相关。特别是,在右侧表达式中的运算符优先级高于左侧表达式中的运算符的特殊情况下,首先计算右侧表达式是不正确的。在所有情况下,子表达式都是从左到右严格计算的。

      (严格来说,这并不完全正确。只有结果必须好像这是真的。我想这主要与多线程代码相关,其中另一个线程可能会在计算过程中中断我们的代码并注意右侧表达式的副作用已经发生,但左侧表达式的副作用尚未发生。)

      【讨论】:

        猜你喜欢
        • 2013-06-18
        • 2022-01-29
        • 2021-03-20
        • 2013-11-02
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多