重複の可能性:
ブール値の結果がわかった後、Javaは残りの条件を評価しますか?
Javaで複数のステートメントを含むコードを実行する&&
場合、最初の比較がfalseに解決された場合、コンパイラは追加のブール比較を解決し続けますか?
if (1==2 && 3==4 && 4==5) { Do Something }
falseと判断する1==2
と、コンパイラはすぐにifステートメントから抜け出しますか、それとも解決3==4
を続け4==5
ますか?
重複の可能性:
ブール値の結果がわかった後、Javaは残りの条件を評価しますか?
Javaで複数のステートメントを含むコードを実行する&&
場合、最初の比較がfalseに解決された場合、コンパイラは追加のブール比較を解決し続けますか?
if (1==2 && 3==4 && 4==5) { Do Something }
falseと判断する1==2
と、コンパイラはすぐにifステートメントから抜け出しますか、それとも解決3==4
を続け4==5
ますか?
その場合&&
、条件の1つが偽であることが検出されるとすぐに評価が停止します。これは短絡評価と呼ばれます。
任意の論理式の場合most compiler stop evaluation expression as soon as result evaluated
。それは Java だけでなく、ほぼすべての言語で見られます。(ただし、VB6 などのすべてではありません)
次の方法でも確認できます。
i = 0、j = 1;
私 && ++j;
system.out.print(" j=" + j);
の値は、 ++j が実行されなかったj will be 1
ことを意味します。
これはコンパイラに違いはありません。ブール比較を1つ以上の.classファイルで表されるマシンコードに解決するだけです。
実際の実行時間に関しては...コンピュータサイエンスのクラスで正しく覚えていれば、タルンとリューズの両方の答えが正しいです。正しくない式に到達するとすぐに、比較が短絡します。
最初の比較が false に解決された場合、コンパイラは引き続き追加のブール比較を解決しますか?
短い答え。いいえ!コンパイラjavac
と は、JIT
すべてのコードを静的に分析します。このようなショートカットは必要ありません。たとえば、2 番目の条件がコンパイルされない場合、最初の条件に関係なく、常にコンパイル エラーが発生します。
あなたが尋ねようとしていたのは次のようなものです。最初または 2 番目の条件が次の場合、プログラムは他の条件を実行しますかfalse
。この場合は実行しません。
&&
-上記はshort-circuit AND operator
です。1番目の条件がfalseになる場合、2番目の条件は評価されません。
例えば:
if ((a==false) && (b==true)){
}
上記は最初の評価後に停止します。
-両方の条件の評価を強制する場合は、Non-Short Circuit AND (&)
IF "1==2" が false の場合、コンパイラはすぐに if ステートメントを分割します。
タイトルのキーワード「効率」への補足:-他の回答で述べたように、基本的な質問は簡単に答えられるため、効率の問題ではなく、何らかの理由ですべての式を評価する必要がある場合の質問です。状態を変更するコードを実行するとき (ちなみに、これはまったく適切なコーディングではありません)。
しかし、「効率」を実行速度の観点から考えると、そのレベルで最適化する必要はほとんどありません。コンパイラがそれを行うか、違いに気付かないかのいずれかです。タイムクリティカルな操作や非常に大きなループで実行される操作では重要かもしれませんが、他のほとんどすべての場合では、他の人間がそれをよく読めるように、きれいなコードを書くことがはるかに重要です。