【问题标题】:Effect of order of operations on increment operator [duplicate]操作顺序对增量运算符的影响
【发布时间】:2015-10-06 00:54:45
【问题描述】:

让我们看下面的代码:

int[] data   = {1, 2, 3};
int   pos    = 0;
int   result = data[pos++] + data[pos++]*data[pos++];

我是否保证我的 result 始终为 1 + 2*3,即 7,或者 Java 编译器或 JVM 是否可以重新排序 data[pos++] 语句的执行,例如,我得到 3 + 1* 2,即5,因为乘法优先于加法?

换句话说:在一个包含多个++-操作的单个语句中,我是否保证它们总是从左到右执行?

【问题讨论】:

  • 我不是反对者之一,但我不太了解您的问题。如果您想查看运算符在 Java 中的优先级,可以在这里查看:docs.oracle.com/javase/tutorial/java/nutsandbolts/…
  • @SotiriosDelimanolis 实际上,这个问题与您链接的问题不同。您链接的那个询问在左侧之前评估的作业右侧的顺序。我的问题只涉及右手边。此外,在您链接的问题中,由于乘法运算的交换属性,任何对 x++ 术语的重新排序都会产生相同的答案。
  • 我投了赞成票,因为我认为这个问题表现出对语言的真正好奇心。如果您向我展示了代码并询问了结果,我无法计算,但我可以更笼统地说“它将永远是它的样子”。示例代码中确实没有任何复杂到可以预期结果不确定的内容。
  • 如果您有这种感觉,请将其编辑到您的问题中。这就是您的问题将如何添加到重新打开队列中的方式。现在,操作数无关紧要,赋值部分也无关紧要。您可以通过删除变量的一项评估来忽略+=。正如 JLS 中的引文所述,必须对操作数进行全面评估。此外,这在 Java 中定义良好,并且在任何运行时的每次调用中都表现相同。

标签: java increment


【解决方案1】:

在 Java 中,这是有保证的。

来自Java Language Specification, section 15.7.1

二元运算符的左侧操作数似乎在右侧操作数的任何部分被评估之前已被完全评估。

这意味着在a+b 中,ab 之前评估,而在x*yxy 之前评估。

您有一个p + (q * r) 形式的表达式。根据上述规则,p 必须在 (q * r) 之前评估。并且在评估q * r 时,必须在r 之前评估q。所以必须评估p,然后是q,然后是r

(请注意,此行为不同于 C 和 C++)

【讨论】:

    【解决方案2】:

    引用Java Language Specification:

    Java 编程语言保证运算符的操作数似乎以特定的计算顺序进行计算,即从左到右

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2018-10-09
      • 2011-12-10
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2018-09-13
      相关资源
      最近更新 更多