0
A && B || C && D

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

Are both boolean logic equal in C++? I am confused.

4

3 回答 3

4

Whether or not they're equal depends entirely on how you define your operator precedence. If && takes precedence over ||, then yes. Otherwise, no.

于 2012-12-27T21:04:12.020 回答
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

所以 the((A && B || C && D) == ((A && B) || (C && D)))是一个重言式。

于 2012-12-27T21:06:12.873 回答
0

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

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

这是来自http://www.ocf.berkeley.edu/~fricke/projects/quinto/dnf.html的引述:

...实际上,我们通常将合取与乘法联系起来,将析取与加法联系起来。事实上,如果我们用 1 来识别真,用 0 来识别假,那么 {0,1} 再加上大小为 2 的伽罗瓦域上的加法和乘法的通常定义(例如,算术模 2),然后是加法 (+) 和析取(或)实际上是相同的,乘法和合取(和)也是如此。...

笼统地说,计算机语言倾向于尊重乘法运算符优于加法运算符的优先级。

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

于 2013-01-11T17:41:11.780 回答