私の理解では、Javaで&&を数学演算として使用する場合、評価のLHS(左側)が失敗すると、右側はチェックされないためです。
false && getName();
LHSはすでに失敗しているため、getName()が呼び出されることはありません。
false & getName();
LHSが失敗したことがわかっている場合、いつRHSを確認したいと思いますか?確かに、実行されているRHS評価への依存は、悪いコーディング慣行になるでしょうか?
ありがとうございました
私の理解では、Javaで&&を数学演算として使用する場合、評価のLHS(左側)が失敗すると、右側はチェックされないためです。
false && getName();
LHSはすでに失敗しているため、getName()が呼び出されることはありません。
false & getName();
LHSが失敗したことがわかっている場合、いつRHSを確認したいと思いますか?確かに、実行されているRHS評価への依存は、悪いコーディング慣行になるでしょうか?
ありがとうございました
理由は&
、&&
一方が右側を評価し、もう一方が評価しないということです。
&
はビット演算子であり、2つの値のビットごとのANDを作成します。値を返します。
理論的には、左側のすべてのビットが0の場合(の場合のようにfalse
)、右側を必ずしも評価してはなりません。あらゆる場合に評価されるのは設計上の決定だと思います。単純なケースでは、左側が0であるかどうかをチェックするよりも高速です。
&&
は条件付き論理演算子であり、2つのブール値を取り、ブール値を返します(つまりtrue
、両側がである場合に限りますtrue
)。
ここでも同じことが言えます。左側がのfalse
場合、右側を確認する必要はありません。ここでは、その場合、右側の評価をスキップすることが決定されました。
そして最後の質問に答えるために(LHSが失敗した場合にRHSをいつ評価したいか)、それが問題ない可能性があるいくつかのシナリオがあります。ただし、いずれの場合も、読みやすさを損なうことなく、これらの状況を防ぐことができます(両方の式が評価されることを確認するための良い方法については、jocelynの回答を参照してください)。実際、jocelynのやり方は。よりも読みやすいと思いますif (exprA() & exprB()) { ... }
。
個人的には&
、ビット単位のANDが本当に必要でない限り、使用することはありません。
Java ショートカット演算子 & を使用すべきでない場合
それは奇妙な質問です。私が考えることができる最良の答えは、の短絡動作が必要な場合は使用しないことです&&
。(そして、それはほとんどの場合です...)
実行中の RHS 評価に依存することは、コーディングの慣習として悪いのでしょうか?
同意しません。これは、副作用が悪いコーディング プラクティスであると言っているのと同じです。
ブール式で使用する必要はめったにないことを認めますが、それ&
を使用することが悪い習慣になるわけではありません。
実際、RHS の呼び出しに依存するのは悪い習慣です。毎回呼び出す必要がある場合は、前に呼び出して、結果を保存し、比較式で使用します。
if (false && getresult()) {
}
になる
Boolean result = getresult();
if (false && result) {
}
もう 1 つの典型的な使用例は、計算された両方の条件をチェックする場合です。
if(++i < 0 & ++j < 0)
この例では、i
j
増加の値に関係なく。
これは別の方法で達成できることに注意してください。数行のコードを節約できます。また、言語として、両方を評価する機会を与えるのは良いことです。そうでなければ、誰かが私ができない理由を尋ねることができます.
ビット単位の ANDing で使用されます
例えば
int i = 3; // 11 - binary
int j = 7; / 111 - binary
int k = i &j; // 11 & 111 = 11 = 3 (decimal)
基本的に & は論理 AND を行うため、両方の条件を評価してから AND を評価する場合は、次を使用できます