71

object の簡単な例を見てみましょうCatcat「not null」がオレンジ色または灰色であることを確認したい。

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

AND が最初に来て、次に OR が来ると思います。私はちょっとあいまいなので、ここに私の質問があります:

  1. 何が起こるか確実に理解できるように、誰かがこの声明を順を追って説明してもらえますか?

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

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

4

6 に答える 6

68

Java チュートリアルには、演算子の優先順位を示すリストがあります。等値演算子が最初に評価され、次に&&、次にが評価され||ます。括弧は何よりも先に評価されるため、括弧を追加すると順序が変わる可能性があります。これは通常、どの言語でもほぼ同じですが、常に再確認することをお勧めします。

デバッグに 1 日を費やすことになるのは、想定していない動作のわずかな違いであるため、評価の順序を確認できるように括弧を配置することをお勧めします。

于 2010-02-15T02:08:23.140 に答える
23

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

  1. 括弧
  2. いいえ
  3. また

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

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"
于 2010-02-15T02:05:41.130 に答える
8

式は基本的に次と同じです。

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
于 2010-02-15T02:06:08.107 に答える
6

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

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

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

最後に、 if ステートメントがまだ間違っていることに注意してください。cat が null の場合、3 番目の式がまだ実行されているため、null ポインターの例外が発生するためです。

それを行う正しい方法は次のとおりです。

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

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

于 2010-02-15T02:05:56.807 に答える
5

ええ&&、間違いなく前に評価され||ます。cat.getColor() == "orange"しかし、予期しない結果をもたらす可能性があることを行っていることがわかります。代わりにこれが必要な場合があります:

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
    //do stuff
}
于 2010-02-15T03:01:24.940 に答える
-4

操作の順序は必要なものではありません。ブール代数が必要です。これにはブール関数が含まれます。Maxterms/minterms、Gray コード、Karnaugh テーブル、ダイオード、トランジスタ、論理ゲート、マルチプレクサ、bitadder、フリップフロップ...必要なのは、コンピューターまたは仮想マシンにブール "ロジック" を実装することです。「操作の順序」で、論理ゲート (OR、if) ナノ秒間隔の遅延の管理などの物理学について何かを参照できますか?

于 2015-06-27T04:49:00.190 に答える