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

Pac*_*ier 11 java jvm operator-precedence jls

考虑这个功能:

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

- 1以前是否需要执行JVM + b

如果我们将一个系统分析器连接到JVM,我们会在+ b操作之前看到正在执行的+ 1操作吗?

Ósc*_*pez 7

是的,它符合Java语言规范,§15.7.

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

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

  • @Rob是的,确实如此.它可以按执行线程**的任何顺序执行操作,就好像它们是按指定的顺序执行一样.然而,从其他线程的角度来看,它们似乎不按顺序发生.这就是多线程必须使用明确定义的内存屏障进行协调的原因. (2认同)

Ras*_*ber 6

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

x = foo() - 1 + bar()
Run Code Online (Sandbox Code Playgroud)

,调用方法的顺序.

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

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

由于表达式x = x - 1 + q在所有方面都是等价的,x = x + q - 1因此允许一致的实现重写表达式(如果由于某种原因应该决定更有效).