Use &&
/AND
/and
, not ||
/OR
/or
:
v != "x" && v != "y" && v != "z"
Problem
If an if
块总是被执行,if 块的条件总是评估为true
。逻辑表达式一定是错误的。
让我们考虑一下v != "x" || v != "y" || v != "z"
对于每个值v
.
-
When v = "x"
,
v != "x"
变成"x" != "x"
,即false.
v != "y"
变成"x" != "y"
,即true.
v != "z"
变成"x" != "z"
,即true.
该表达式的计算结果为false || true || true
,即true.
-
When v = "y"
,表达式变为
"y" != "x" || "y" != "y" || "y" != "z"
or true || false || true
,即true.
-
When v = "z"
,表达式变为
"z" != "x" || "z" != "y" || "z" != "z"
or true || true || false
,即true.
-
对于任何其他值v
,表达式的计算结果为true || true || true
,即true.
或者,考虑真值表:
│ A B C │
v │ v != "x" v != "y" v != "z" │ A || B || C
───────┼──────────────────────────────────┼──────────────
"x" │ false true true │ true
"y" │ true false true │ true
"z" │ true true false │ true
other │ true true true │ true
正如你所看到的,你的逻辑表达always评估为true
.
Solution
你想要做的是,找到一个计算结果为的逻辑表达式true
when
(v is not "x")
and
(v is not "y")
and
(v is not "z")
.
正确的构造是,
-
对于类 C 语言(例如c#, javascript-(可能需要严格相等运算符!==
), php)
if (v != "x" && v != "y" && v != "z")
{
// the statements I want to be executed
// if v is neither "x", nor "y", nor "z"
}
-
对于类似 Pascal 的语言plsql
IF (v != 'x' AND v != 'y' AND v != 'z') THEN
-- the statements I want to be executed
-- if v is neither "x", nor "y", nor "z"
END IF;
德摩根定律
By 德摩根定律,表达式也可以重写为(使用类似 C 的语法)
!(v == "x" || v == "y" || v == "z")
meaning
not
((v is "x")
or
(v is "y")
or
(v is "z"))
.
这使得逻辑更加明显。
特定语言
某些语言具有用于测试集合中的成员资格的特定构造,或者您可以使用数组/列表操作。
-
sql: v NOT IN ('x', 'y', 'z')
-
javascript: !["x", "y", "z"].includes(v)
-
python: v not in {"x", "y", "z"}
-
java: !Arrays.asList("x", "y", "z").contains(v)
-
java-9(以上):!Set.of("x", "y", "z").contains(v)