【发布时间】: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 中定义良好,并且在任何运行时的每次调用中都表现相同。