我注意到,在组合 !=
和 &&
运算符时,我偶然发现了 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;
}
关于c++ - 具有多个条件 IF 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42088023/