我有一个变量 v
在我的程序中,它可以从一组值中取任何值
"a", "b", "c", ..., "z"
我的目标是仅在
v
时才执行某些语句不是 "x"
, "y"
, 或 "z"
.我试过了,
if (v != "x" || v != "y" || v != "z")
{
// the statements I want to be executed
// if v is neither "x", nor "y", nor "z"
}
IF (v != 'x' OR v != 'y' OR v != 'z') THEN
-- the statements I want to be executed
-- if v is neither "x", nor "y", nor "z"
END IF;
if 条件中的语句 总是被执行 .我做错了什么吗?
最佳答案
使用 &&
/AND
/and
,不是 ||
/OR
/or
:
v != "x" && v != "y" && v != "z"
问题如果
if
块总是被执行,if 块的条件总是计算为 true
.逻辑表达式一定是错误的。让我们考虑一下
v != "x" || v != "y" || v != "z"
对于 v
的每个值.v = "x"
,v != "x"
变成 "x" != "x"
,这是错误的。v != "y"
变成 "x" != "y"
,这是真的。v != "z"
变成 "x" != "z"
,这是真的。表达式的计算结果为
false || true || true
,这是真的。v = "y"
,表达式变为 "y" != "x" || "y" != "y" || "y" != "z"
或 true || false || true
,这是真的。v = "z"
,表达式变为 "z" != "x" || "z" != "y" || "z" != "z"
或 true || true || false
,这是真的。v
的任何其他值,表达式的计算结果为 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
如您所见,您的逻辑表达式的计算结果始终为 true
.解决方案
您想要做的是,找到一个计算结果为
true
的逻辑表达式。什么时候(v is not "x")
and
(v is not "y")
and
(v is not "z")
.正确的构造是,
!==
)、 php ) if (v != "x" && v != "y" && v != "z")
{
// the statements I want to be executed
// if v is neither "x", nor "y", nor "z"
}
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;
德摩根定律
来自 De Morgan's law ,表达式也可以改写为(使用类似 C 的语法)
!(v == "x" || v == "y" || v == "z")
意义not
((v is "x")
or
(v is "y")
or
(v is "z"))
.这使得逻辑更明显一些。
特定语言
某些语言具有用于测试集合成员资格的特定构造,或者您可以使用数组/列表操作。
v NOT IN ('x', 'y', 'z')
["x", "y", "z"].indexOf(v) == -1
v not in {"x", "y", "z"}
!Arrays.asList("x", "y", "z").contains(v)
!Set.of("x", "y", "z").contains(v)
关于if-statement - 为什么针对多个值对一个变量进行非等式检查总是返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337003/