布尔运算相关
Related to boolean operations
我遇到过以下代码:
const bool isIntersect = ...;
const bool isReversed = ...
if(!isIntersect != isReversed) {
//some stuff
}
这对我来说很奇怪。问题是可以用更清楚的方式写吗:
所以它似乎不像 !isIntersect || isIntersect
也不像 !isIntersect && isIntersect
.
if(isIntersect == isReversed) {
应该是一样的
要在没有(不)等式运算符的情况下表示它,您需要 XOR 的否定,
if(!(isIntersect ^ isReversed)) {
但这还不够清楚。
画个真相table:
isIntersect isReversed outcome
false false true
false true false
true false false
true true true
如我们所见,这只是一个等价:
isIntersect == isReversed
所以可以把代码简化成
if (isIntersect == isReversed) {
// some stuff
}
以下是四种结果情景:
场景一
const bool isIntersect = true;
const bool isReversed = true;
if(!isIntersect != isReversed) {
// DOES RUN => ((!true) != true) => (false != true) => true
}
场景二
const bool isIntersect = true;
const bool isReversed = false;
if(!isIntersect != isReversed) {
// DOES NOT RUN => ((!true) != false) => (false != false) => false
}
场景三
const bool isIntersect = false;
const bool isReversed = true;
if(!isIntersect != isReversed) {
// DOES NOT RUN => ((!false) != true) => (true != true) => false
}
场景四
const bool isIntersect = false;
const bool isReversed = false;
if(!isIntersect != isReversed) {
// DOES RUN => ((!false) != false) => (true != false) => true
}
这给了我们以下真相table:
isIntersect isReversed outcome
==================================
false false true
false true false
true false false
true true true
因此上述if-statement
中的代码要么运行:
- 如果
isIntersect
和 isReversed
都是 true
或
- 如果
isIntersect
和 isReversed
都是 false
可以这样理解:
if((isIntersect && isReversed) || (!isIntersect && !isReversed)) { ... }
使用德摩根定理简化:
if((isIntersect && isReversed) || !(isIntersect || isReversed)) { ... }
// May be more difficult to understand it this way
最简单的形式语句:
if (isIntersect == isReversed) { ... }
该测试正在测试 isIntersected
和 isReversed
是否都为真或均为假,因此更详细(但可能更容易理解)的测试方法是
if ((isIntersected && isReversed) || (!isIntersected && !isReversed))
我遇到过以下代码:
const bool isIntersect = ...;
const bool isReversed = ...
if(!isIntersect != isReversed) {
//some stuff
}
这对我来说很奇怪。问题是可以用更清楚的方式写吗:
所以它似乎不像 !isIntersect || isIntersect
也不像 !isIntersect && isIntersect
.
if(isIntersect == isReversed) {
应该是一样的
要在没有(不)等式运算符的情况下表示它,您需要 XOR 的否定,
if(!(isIntersect ^ isReversed)) {
但这还不够清楚。
画个真相table:
isIntersect isReversed outcome
false false true
false true false
true false false
true true true
如我们所见,这只是一个等价:
isIntersect == isReversed
所以可以把代码简化成
if (isIntersect == isReversed) {
// some stuff
}
以下是四种结果情景:
场景一
const bool isIntersect = true;
const bool isReversed = true;
if(!isIntersect != isReversed) {
// DOES RUN => ((!true) != true) => (false != true) => true
}
场景二
const bool isIntersect = true;
const bool isReversed = false;
if(!isIntersect != isReversed) {
// DOES NOT RUN => ((!true) != false) => (false != false) => false
}
场景三
const bool isIntersect = false;
const bool isReversed = true;
if(!isIntersect != isReversed) {
// DOES NOT RUN => ((!false) != true) => (true != true) => false
}
场景四
const bool isIntersect = false;
const bool isReversed = false;
if(!isIntersect != isReversed) {
// DOES RUN => ((!false) != false) => (true != false) => true
}
这给了我们以下真相table:
isIntersect isReversed outcome
==================================
false false true
false true false
true false false
true true true
因此上述if-statement
中的代码要么运行:
- 如果
isIntersect
和isReversed
都是true
或
- 如果
isIntersect
和isReversed
都是false
可以这样理解:
if((isIntersect && isReversed) || (!isIntersect && !isReversed)) { ... }
使用德摩根定理简化:
if((isIntersect && isReversed) || !(isIntersect || isReversed)) { ... }
// May be more difficult to understand it this way
最简单的形式语句:
if (isIntersect == isReversed) { ... }
该测试正在测试 isIntersected
和 isReversed
是否都为真或均为假,因此更详细(但可能更容易理解)的测试方法是
if ((isIntersected && isReversed) || (!isIntersected && !isReversed))