Java中是否保证了从左到右的操作顺序?

时间:2012-01-31 14:41:11

标签: java jvm operator-precedence jls

考虑这个功能:

public static final int F(int a, int b) {
    a = a - 1 + b;
    // and some stuff
    return a;
}

JVM的实现是否需要在- 1之前执行+ b

如果我们有一个连接到JVM的系统分析器,我们是否会在+ b操作之前看到+ 1操作?

10 个答案:

答案 0 :(得分:7)

是的,它是Java语言specification,§15.7。

  

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

     

建议代码不要严格依赖此规范。当每个表达式最多包含一个副作用时,代码通常更清晰,作为其最外层的操作,并且当代码不依赖于由于从左到右的表达式评估而出现哪个异常时,代码就更清晰了。

答案 1 :(得分:6)

实际上,我不同意其余的答案。人们所指的JLS§15.7讨论了操作数的评估。也就是说,在表达式

x = foo() - 1 + bar()

,调用方法的顺序。

相关部分是§15.7.3,其中指定了

  

实现可能利用代数身份(例如关联法则)将表达式重写为更方便的计算顺序除非可以证明替换表达式是等值及其可观察到的副作用 [...]

由于表达式x = x - 1 + q在所有方面都等同于x = x + q - 1,因此允许符合条件的实现重写表达式(如果出于某种原因应该决定更有效)。

答案 2 :(得分:2)

根据here

  

同一行上的运算符具有相同的优先级。当经营者   相同的优先级出现在同一个表达式中,必须遵守规则   首先评估。除了之外的所有二元运算符   赋值运算符从左到右进行评估;分配   运营商从右到左进行评估。

是的。

答案 3 :(得分:2)

是的,虽然更大的问题是真的重要吗?减法和加法在任何科学数学运算中具有相同的优先级并且是可交换的。那就是:

x =输入 - 1 + q;

相同

x =输入+ q - 1;

答案 4 :(得分:2)

是:

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7

JVM将解释

x = input - 1 + q;

作为

x = (input - 1) + q;

答案 5 :(得分:2)

实际上,JVM实现并不重要,因为它们只是从类文件中执行指令列表。

答案 6 :(得分:2)

您可以在此处看到Java中的运算符优先级:http://bmanolov.free.fr/javaoperators.php。由于+-具有相同的优先级,因此它们将按照它们出现的顺序执行。

如果您想更清楚首先发生的操作(或者如果您想要破坏内置优先级),您可以(并且应该)使用parantheses((和{{1} }),像这样:

)

答案 7 :(得分:1)

是的,它始终会,即使它不会影响加/减的结果。

答案 8 :(得分:1)

在我看来,执行总会产生副作用 X + q - 1 当你应该执行 X - 1 + q。

当和x + q超过Bignum时,从左到右执行将成功...乱序执行将产生溢出。

因此,乱序执行会产生副作用。

除非乱序执行陷阱溢出,否则在必要时以正确的顺序重新计算,以避免副作用。

答案 9 :(得分:0)

这里重要的是,java确实具有运算符的行优先级,它似乎基于操作的基本算术顺序。有关完整优先级的列表,请查看此source