web-dev-qa-db-ja.com

ブール演算子の優先順位

プログラミング言語での演算子の優先順位が実装に依存するのか、それともすべての言語が従う固定ルールがあるのか​​を知りたいのですが。また、可能であれば、優先順位が最も高い次の演算子を最初に注文できますか:AND、OR、NOT、XOR。

15
Mika

グーグルで調べたところ、 this は、APLやSmalltalkなどの一部の言語には演算子の優先順位ルールがなく、式を左から右/左から右に厳密に評価することを示しています。

ただし、従う優先順位の相対的な順序は、ほとんどの言語、特にCから派生した言語では、NOT> XOR> AND> OR

12
emiljho

式が&&と||を組み合わせると、その評価は正しい順序で行う必要があります。括弧は、算術演算の場合と同様に、オペランドを正しい演算子でグループ化するために使用できます。また、算術演算子と同様に、論理演算子には、括弧がない場合に物事をグループ化する方法を決定する優先順位があります。

式では、優先順位が最も高い演算子が最初にそのオペランドでグループ化され、次に最も高い演算子がそのオペランドでグループ化されます。同じ優先順位の論理演算子が複数ある場合、それらは左から右に調べられます。

プログラマーは、演算子の優先順位だけが機能する場合でも、読みやすくするために括弧を使用してオペランドをグループ化するのが一般的です。

enter image description here

ソース

Javaの簡単なテストで、次のことが当てはまります。

@Test
public void booleanPrecedenceTest() {
    boolean A = true, B = false, C = true, D = false;
    Assert.assertTrue((A || B && C) == (A || (B && C)));
    Assert.assertTrue((A && B || C && D) == ((A && B) || (C && D)));
    Assert.assertTrue((A && B && C || D) == (((A && B) && C) || D));
    Assert.assertTrue((!A && B || C) == (((!A) && B) || C));
}
5
Ivan Huang

ブールまたはビット単位?決まったルールはありません。ほとんどの言語には同様のルールがありますが、詳細が異なります。言語定義で調べてください。

2

3つの基本的なブール演算子があります:NOT、AND、OR。 XORは_A AND NOT B OR NOT A AND B_または_(A OR NOT B) AND (NOT A OR B)_の単純なバージョンです。したがって、これら3つだけが共通の優先順位を持ちます:NOT> AND> OR。XOR言語での位置は異なりますが、確かにANDよりも優先順位が高く、ORよりも低くはありません。ほとんどの言語(C/C++/Javascriptなど)ではANDとORの間にありますが、他の言語(Perlなど)では優先順位が異なります。 )XORはORと同じ優先順位を持ちます。

(ORはANDとNOTのみを使用して表現できますが、それでも基本的な演算子です:A OR B = NOT(NOT A AND NOT B)

2
FERcsI