質問

オブジェクトの簡単な例を見てみましょう Cat. 。「nullではない」ことを確認したい cat オレンジかグレーのどちらかです。

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}

私は AND が最初に来て、次に OR が来ると信じています。ちょっと曖昧なのですが、以下に質問させていただきます。

  1. 何が起こるかを確実に理解できるように、誰かがこのステートメントを詳しく説明してもらえますか?

  2. また、括弧を追加するとどうなるでしょうか。それは操作の順序を変更しますか?

  3. 操作の順序は言語ごとに変わりますか?

他のヒント

ブール演算の順序 (私が信じているすべての言語で):

  1. 括弧
  2. ない
  3. そして
  4. または

したがって、上記のロジックは次と同等です。

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"

の発現は、基本的に同一であります

if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
  ...
}

ここでの優先順位は、ANDです(&&)よりも高い優先順位のOR(||)を持っています。

また==を使用すると、文字列の等価性をテストすることを知っている必要があります。の、時にはのJavaでの作業が、それはあなたがそれを行うべきかではありません。あなたが行う必要があります:

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
  ...
}

つまり、単に参照の等価をしたequals()ない、String比較のため==メソッドを使用します。文字列の参照の等価は誤解を招くことができます。たとえばます:

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false

うん&&は間違いなく||前に評価されます。しかし、私はあなたがあなたの予想外の結果を与えるかもしれないcat.getColor() == "orange"をやっている参照してください。あなたはこの代わりにしたいことがあります:

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
    //do stuff
}

まず、if ステートメントには 3 つの主要な式が含まれています。

  1. 猫 != null
  2. cat.getColor() == "オレンジ"
  3. cat.getColor() == "グレー"

最初の式は、cat が null でないかどうかを単純にチェックします。そうしないと、2 番目の式が実行され、結果として NPE(null pointer excpetion). 。これが、最初の式と 2 番目の式の間に && を使用する理由です。使用するときは &&, 、最初の式が false と評価された場合、2 番目の式は実行されません。最後に、猫の色が灰色かどうかを確認します。

最後に、IFステートメントがまだあることに注意してください 間違っている 猫がヌルの場合、3番目の式がまだ実行されているため、 nullポインターの例外.

正しい方法は次のとおりです。

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 

括弧の順序を確認してください。

オペレーションの順序は、あなたが必要なものではありません、あなたはブール代数を必要とする、これはブール関数が含まれています。 Maxterms /最小項、グレイコード、カルノーテーブル、ダイオード、トランジスタ、ロジックゲート、マルチプレクサ、bitadders、ビーチサンダル... 何が欲しいのは、コンピュータまたは仮想マシン上でブール「ロジック」を実装することです。間隔をナノ秒「の操作の順序」を使用すると、(あれば、OR)論理ゲートに遅延を管理するように物理学について何かを参照してくださいできますか?

scroll top