Java では、ブール値の「操作順序」とは何ですか?
-
20-09-2019 - |
質問
オブジェクトの簡単な例を見てみましょう Cat
. 。「nullではない」ことを確認したい cat
オレンジかグレーのどちらかです。
if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}
私は AND が最初に来て、次に OR が来ると信じています。ちょっと曖昧なのですが、以下に質問させていただきます。
何が起こるかを確実に理解できるように、誰かがこのステートメントを詳しく説明してもらえますか?
また、括弧を追加するとどうなるでしょうか。それは操作の順序を変更しますか?
操作の順序は言語ごとに変わりますか?
解決
のJavaチュートリアル演算子の優先順位。等価演算子は、その後、その後、&&
を||
、最初に評価されます。括弧は何か前に評価されるので、それらを追加する順序を変更することができます。これはかなり通常の言語への言語から同じですが、それは常にダブルチェックすることをお勧めします。
それはあなたがそれはあなたが一日のデバッグを過ごすことがありますので、あなたは評価の順序がどうなるか確認しているので、それが所定の位置に括弧を置くことをお勧めします期待していないことを行動の小さな変化です。
他のヒント
ブール演算の順序 (私が信じているすべての言語で):
- 括弧
- ない
- そして
- または
したがって、上記のロジックは次と同等です。
(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 つの主要な式が含まれています。
- 猫 != null
- cat.getColor() == "オレンジ"
- 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)論理ゲートに遅延を管理するように物理学について何かを参照してくださいできますか?