4

私の理解では、Javaで&&を数学演算として使用する場合、評価のLHS(左側)が失敗すると、右側はチェックされないためです。

false && getName();

LHSはすでに失敗しているため、getName()が呼び出されることはありません。

false & getName();

LHSが失敗したことがわかっている場合、いつRHSを確認したいと思いますか?確かに、実行されているRHS評価への依存は、悪いコーディング慣行になるでしょうか?

ありがとうございました

4

5 に答える 5

5

理由は&&&一方が右側を評価し、もう一方が評価しないということです。

  • &ビット演算子であり、2つの値のビットごとのANDを作成します。値を返します。

    理論的には、左側のすべてのビットが0の場合(の場合のようにfalse)、右側を必ずしも評価してはなりません。あらゆる場合に評価されるの設計上の決定だと思います。単純なケースでは、左側が0であるかどうかをチェックするよりも高速です。

  • &&条件付き論理演算子であり、2つのブール値を取り、ブール値を返します(つまりtrue、両側がである場合に限りますtrue)。

    ここでも同じことが言えます。左側がのfalse場合、右側を確認する必要はありません。ここでは、その場合、右側の評価をスキップすることが決定されました。

そして最後の質問に答えるために(LHSが失敗した場合にRHSをいつ評価したいか)、それが問題ない可能性があるいくつかのシナリオがあります。ただし、いずれの場合も、読みやすさを損なうことなく、これらの状況を防ぐことができます(両方の式が評価されることを確認するための良い方法については、jocelynの回答を参照してください)。実際、jocelynのやり方は。よりも読みやすいと思いますif (exprA() & exprB()) { ... }

個人的には&、ビット単位のANDが本当に必要でない限り、使用することはありません。

于 2012-06-21T10:22:19.160 に答える
3

Java ショートカット演算子 & を使用すべきでない場合

それは奇妙な質問です。私が考えることができる最良の答えは、の短絡動作が必要な場合は使用しないことです&&。(そして、それはほとんどの場合です...)

実行中の RHS 評価に依存することは、コーディングの慣習として悪いのでしょうか?

同意しません。これは、副作用が悪いコーディング プラクティスであると言っているのと同じです。

ブール式で使用する必要はめったにないことを認めますが、それ&を使用することが悪い習慣になるわけではありません。

于 2012-06-21T10:23:29.767 に答える
2

実際、RHS の呼び出しに依存するのは悪い習慣です。毎回呼び出す必要がある場合は、前に呼び出して、結果を保存し、比較式で使用します。

if (false && getresult()) {

}

になる

Boolean result = getresult();
if (false && result) {

}
于 2012-06-21T10:12:44.497 に答える
1

もう 1 つの典型的な使用例は、計算された両方の条件をチェックする場合です。

if(++i < 0 & ++j < 0)

この例では、i j増加の値に関係なく。

これは別の方法で達成できることに注意してください。数行のコードを節約できます。また、言語として、両方を評価する機会を与えるのは良いことです。そうでなければ、誰かが私ができない理由を尋ねることができます.

于 2012-06-21T10:10:57.930 に答える
1

ビット単位の ANDing で使用されます

例えば

int i = 3; // 11 - binary
int j = 7; / 111 - binary
int k = i &j; // 11 & 111 = 11 = 3 (decimal)

基本的に & は論理 AND を行うため、両方の条件を評価してから AND を評価する場合は、次を使用できます

于 2012-06-21T09:59:52.687 に答える