コードの場合:
if(f() && false) {
// never happens
}
f()
それが呼び出され、コンパイラによって「最適化」されないことを常に確信できますか?
コードの場合:
if(f() && false) {
// never happens
}
f()
それが呼び出され、コンパイラによって「最適化」されないことを常に確信できますか?
コンパイラはjavac
ほとんど最適化を行いません。
JIT はコードを最適化できますが、この場合、&&
と||
は常に左から右に評価されます。
代入演算子を除くすべての二項演算子は、左から右に評価されます
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
JLSから。
15.7. 評価順序
Java プログラミング言語は、演算子のオペランドが特定の評価順序 (つまり、左から右) で評価されるように見えることを保証します。
コードがこの仕様に決定的に依存しないことをお勧めします。各式がその最も外側の操作として多くても 1 つの副作用を含む場合、およびコードが式の左から右への評価の結果として発生する例外に正確に依存しない場合、コードは通常より明確になります。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html