考虑这个函数:
public static final int F(int a, int b) {
a = a - 1 + b;
// and some stuff
return a;
}
JVM的实现是否需要在- 1
之前执行+ b
?
如果我们有一个附加到 JVM 的系统分析器,我们会在+ b
操作之前看到正在执行的+ 1
操作吗?
考虑这个函数:
public static final int F(int a, int b) {
a = a - 1 + b;
// and some stuff
return a;
}
JVM的实现是否需要在- 1
之前执行+ b
?
如果我们有一个附加到 JVM 的系统分析器,我们会在+ b
操作之前看到正在执行的+ 1
操作吗?
实际上,我不同意其余的答案。人们所指的 JLS §15.7 讨论了操作数的评估。也就是说,在表达式中
x = foo() - 1 + bar()
, 调用方法的顺序。
相关部分是§15.7.3,其中指定
除非可以证明替换表达式在值和可观察到的副作用[ ...]
由于该表达式x = x - 1 + q
在所有方面都等效于x = x + q - 1
,因此允许符合要求的实现重写该表达式(如果出于某种原因应该决定该表达式更有效)。
是的,它在 Java 语言规范§15.7 中。
Java 编程语言保证运算符的操作数看起来是以特定的评估顺序进行评估的,即从左到右。
建议代码不要严重依赖本规范。当每个表达式最多包含一个副作用时,代码通常会更清晰,作为其最外层的操作,并且当代码不完全依赖于表达式从左到右求值的结果时出现的异常。
根据这里:
同一行中的运算符具有相同的优先级。当相同优先级的运算符出现在同一个表达式中时,必须有一条规则来控制首先计算哪个。除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左求值。
所以是的。
是的,尽管更大的问题是它真的重要吗?减法和加法在任何科学数学运算中具有相同的优先级并且是可交换的。那是:
x = 输入 - 1 + q;
是相同的
x = 输入 + q - 1;
是的:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7
JVM 将解释
x = input - 1 + q;
作为
x = (input - 1) + q;
实际上,重要的不是 JVM 实现,因为它们只是执行类文件中的指令列表。
您可以在这里看到 Java 中的运算符优先级:http: //bmanolov.free.fr/javaoperators.php。因为+
和-
具有相同的优先级,它们将按照它们出现的顺序执行。
如果您想更清楚地知道哪个操作首先发生(或者如果您想打破内置优先级),您可以(并且应该)使用括号((
and )
),如下所示:
x = (a - b) + (c * (d - e))
是的,它总是会的,即使它不会影响加/减的结果。
在我看来,当你应该执行 X - 1 + q 时,执行 X + q - 1 总会有副作用。
当和x + q 超过Bignum 1 时,从左到右执行会成功……乱序执行会产生溢出。
所以乱序执行有副作用。
除非乱序执行陷阱自身溢出,否则在必要时以正确的顺序重新执行计算以避免副作用。
这里要补充的重要一点是,java 确实具有运算符的行内优先级,这似乎基于基本的算术运算顺序。有关完整优先级的列表,请查看此来源