A && B || C && D
(A && B) || (C && D)
両方のブール論理はC++で等しいですか? 私は混乱しています。
それらが等しいかどうかは、演算子の優先順位をどのように定義するかに完全に依存します。&&
が よりも優先される場合は||
、はい。そうでなければ、いいえ。
&&
ほとんどのプログラミング言語では、 operatorが よりも優先度が高いことがわかります||
。たとえば、Java、C#、C、C++、Python、Ruby など。
A && B || C && D
と同等です
(A && B) || (C && D)
コードをコピーして貼り付けることもできます。
#include <iostream>
using namespace std;
int main() {
bool A = false;
bool B = false;
bool C = true;
bool D = true;
for(int i = 0; i < 2; ++i) {
A = (i == 0);
for(int j = 0; j < 2; ++j) {
B = (j == 0);
for(int k = 0; k < 2; ++k) {
C = (k == 0);
for(int l = 0; l < 2; ++l) {
D = (l == 0);
cout << A << " " << B << " " << C << " " << D << " -> ";
cout << ((A && B || C && D) == ((A && B) || (C && D))) << endl;
}
}
}
}
return 0;
}
自分で調べるためにIdeoneに。たとえば C++ では、出力は次のようになります。
1 1 1 1 -> 1
1 1 1 0 -> 1
1 1 0 1 -> 1
1 1 0 0 -> 1
1 0 1 1 -> 1
1 0 1 0 -> 1
1 0 0 1 -> 1
1 0 0 0 -> 1
0 1 1 1 -> 1
0 1 1 0 -> 1
0 1 0 1 -> 1
0 1 0 0 -> 1
0 0 1 1 -> 1
0 0 1 0 -> 1
0 0 0 1 -> 1
0 0 0 0 -> 1
したがって、((A && B || C && D) == ((A && B) || (C && D)))
はトートロジーです。
最終的な回答は、質問している C++ 言語の詳細になりますが、覚えておくべき理由 (および場合によっては方法) について考えるためのヒントを次に示します。
論理積 (AND、&&) は乗算に関連付けられることが多く、論理和 (OR、||) は加算に関連付けられることがよくあります (一般に、乗算は加算よりも優先されます)。
以下はhttp://www.ocf.berkeley.edu/~fricke/projects/quinto/dnf.htmlからの引用です。
... 実際問題として、私たちは通常、接続詞を乗算、選言を足し算と関連付けます。実際、真を 1 で、偽を 0 で識別した場合、{0,1} はサイズ 2 のガロア体に対する通常の加算と乗算の定義 (たとえば、2 を法とする算術演算) と結合され、次に加算 (+) と論理和(or) は実際には同じで、乗算と論理積 (and) も同じです。...
かなり一般的な用語で言えば、コンピューター言語は加法演算子よりも乗法演算子の優先順位を尊重する傾向があります。
(さらに、これらの関連付け、たとえば論理と代数の演算子間の関係は、型システムなどの他の領域でも発生します。その興味深い解説については、代数の概念に関するhttp://blog.lab49.com/archives/3011を参照してください。型システム。)