布尔逻辑布尔逻辑都相等

时间:2012-12-27 21:02:43

标签: boolean-logic

A && B || C && D

(A && B) || (C && D)

C ++中的布尔逻辑是否相等?我很困惑。

3 个答案:

答案 0 :(得分:4)

它们是否相等完全取决于您如何定义运算符优先级。如果&&优先于||,则为是。否则,没有。

答案 1 :(得分:2)

在大多数编程语言中,您会发现运算符&&的优先级高于||。 例如,在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)))是重言式。

答案 2 :(得分:0)

虽然最后的答案是关于您所询问的C ++语言的细节,但这里有一些关于为什么(以及可能如何)记住的想法:

连词(AND,&amp;&amp;)通常与乘法相关联,而析取(OR,||)通常与加法相关(我们通常知道乘法优先于加法)。

以下是http://www.ocf.berkeley.edu/~fricke/projects/quinto/dnf.html的引用:

  

......作为一个实际问题,我们通常会联合起来   乘法和与加法分离。确实,如果我们确定   true为1,false为0,然后{0,1}加上通常的   关于Galois域的加法和乘法的定义   大小2(例如,算术模2),然后加(+)和析取   (或)真的是相同的,乘法和连词(和)也是如此。   ...

以相当笼统的术语来说,计算机语言倾向于尊重乘法运算符优先于加法运算符。

(此外,这些关联,例如逻辑和代数中的运算符之间的关联在其他领域中重新出现,例如类型系统。有关这方面的有趣阐述,请参阅http://blog.lab49.com/archives/3011关于代数类型系统的概念。)