1

評価結果に影響を与える副作用があるコードをデバッグしていexpr1 & expr2ます。JLSはの左から右への評価を保証しているので、それは前に評価されると思いますが、必ずしも。の評価は必要ありません。また、評価順序の変更は、HotSpot(Java 6u20を実行している)によって実行された最適化の結果である可能性があると思われます。HotSpotがそのような最適化を行うことができるかどうか知っていますか?さらに良いことに、疑惑を支持または排除するドキュメントへのポインタを提供します。前もって感謝します。expr1expr2expr2expr1&&&

編集:正しくて読みやすいようにコードを書き直すことを提案してくれた人たちに感謝します-あなたは正しいですが、私はすでにそうしているので、それは私が探しているものではありません。残念ながら、変更をテストするのは難しいので、ここで質問します。

4

2 に答える 2

6

評価順序は、仕様で明確に定義されています。

Javaプログラミング言語は、演算子のオペランドが特定の評価順序、つまり左から右に評価されているように見えることを保証します。

HotSpotオプティマイザーは、結果が変更された場合にexpr1の前にexpr2が評価されるような最適化を行うべきではありません。これを行う場合、それはバグです。

また、次のように書かれていることに注意してください。

コードがこの仕様に大きく依存しないようにすることをお勧めします。

コードは次のように、より明確に書き直すことができます。

int a = expr1;
int b = expr2;
int result = a & b;
于 2010-07-27T18:42:11.390 に答える
1

JLS第3版のセクション15.7では、評価の順序について左から右に説明していますが、評価の順序に大きく依存しないように求めています(短絡の場合を除く)。

于 2010-07-27T18:47:23.220 に答える