c++ - 具有多个条件 IF 语句的奇怪行为

标签 c++ boolean-logic

我注意到,在组合 !=&& 运算符时,我偶然发现了 if 函数的奇怪行为。例如,我有两个 std::string 对象,我想检查它们是否不是 "ffff""0000" 和然后继续进行一些计算。

代码如下所示:

std::string sentData("ffff")
std::string sentAddr("060C")
if (sentData == "ffff") 
    cout << "A 1. Same" << endl;
else 
    cout << "A 1. Different" << endl;
if (sentAddr == "0000") 
    cout << "A 2. Same" << endl;
else 
    cout << "A 2. Different" << endl;
if ((sentData == "ffff") && (sentAddr == "0000")) 
    cout << "A &&. Same" << endl;
else 
    cout << "A &&. Different" << endl;

if (sentData != "ffff") 
    cout << "B 1. Different" << endl;
else 
    cout << "B 1. Same" << endl;
if (sentAddr != "0000") 
    cout << "B 2. Different" << endl;
else 
    cout << "B 2. Same" << endl;
if ((sentData != "ffff") && (sentAddr != "0000")) 
    cout << "B &&. Different" << endl;
else 
    cout << "B &&. Same" << endl;

理论上,我认为它应该产生相同的结果……但事实并非如此。最后一个 if 函数将 && 视为 ||(我不知道为什么),因此我进入最后一个 if 语句,即使只有一个答案是正确的。下面是一些答案。

正常工作:

sentData: ffff  sentAddr: 0000
A 1. Same
A 2. Same
A &&. Same
B 1. Same
B 2. Same
B &&. Same

sentData: ffdf  sentAddr: 060e
A 1. Different
A 2. Different
A &&. Different
B 1. Different
B 2. Different
B &&. Different

工作错误:

sentData: ffff  sentAddr: 060c
A 1. Same
A 2. Different
A &&. Different
B 1. Same
B 2. Different
B &&. Same

sentData: fb8c  sentAddr: 0000
A 1. Different
A 2. Same
A &&. Different
B 1. Different
B 2. Same
B &&. Same

所以如果我在 if ((sentData != "ffff") && (sentAddr != "0000")) 中使用 sentData: fb8c sentAddr: 0000 我得到if (TRUE && FALSE),但显然还是进入了if语句。

问:有人知道为什么吗?

我问这个是因为我想避免编写这样丑陋的代码:

if (!((sentData == "ffff") && (sentAddr == "0000"))) {
    // do stuff
}

if ((sentData == "ffff") && (sentAddr == "0000")) {
    // nothing to do
} else {
    // do stuff
}

最佳答案

你认为 !a && !b!(a && b) 的反义词是错误的。

这是因为分配或取消分配 bool 运算的否定需要您将 bool 运算翻转为它的对偶并对各个内项求反,反之亦然。

这被称为 De Morgan's Law , 是 bool 代数的基本定律。

因此对偶:

(a && b)

实际上是:

(!a || !b)

和对偶:

(!a && !b)

实际上是:

(a || b)

这是工作代码:

#include <iostream>
#include <string>

int main()
{
    using namespace std;

    std::string sentData("ffff");
    std::string sentAddr("060C");

    auto a = (sentData == "ffff");  // true
    auto b = (sentAddr == "0000");  // false

    if (a)              cout << "A 1. Same" << endl;
    else                cout << "A 1. Different" << endl;

    if (b)              cout << "A 2. Same" << endl;
    else                cout << "A 2. Different" << endl;

    if (a && b)         cout << "A &&. Same" << endl;
    else                cout << "A &&. Different" << endl;

    if (!a)             cout << "B 1. Different" << endl;
    else                cout << "B 1. Same" << endl;

    if (!b)             cout << "B 2. Different" << endl;
    else                cout << "B 2. Same" << endl;

    if ((!a || !b))     cout << "B &&. Different" << endl;
    else                cout << "B &&. Same" << endl;
}

See it live on Coliru.

关于c++ - 具有多个条件 IF 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42088023/

相关文章:

language-agnostic - 简化if语句逻辑

functional-programming - 从 Bool 到 Bool 有多少种不同的函数?

c++ - 原始树的子树

c++ - 如何从对象实例中获取成员 typedef

c++ - MPI-并行 HDF5 : H5Pset_fapl_mpio equivalent in C++

c++ - 在 C++ 中打印 boolean 值

python - 如何在 Python 中使用 bool 值 'and'

haskell - Monad 的应用

Python bool 比较逻辑错误

c++ - 使用 | 传递参数