我的程序中有一个变量v
,它可以从值集中获取任何值
"a", "b", "c", ..., "z"
我的目标是仅当 v
不是 "x"
、"y"
或 "时才执行某些语句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' 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
/或
:
v != "x" && v != "y" && v != "z"
问题
如果始终执行 if
block ,则 if block 的条件始终计算为 true
。逻辑表达式一定是错误的。
让我们考虑v != "x"|| v != "y"|| v != "z"
对于 v
的每个值。
当
v = "x"
时,v != "x"
变为"x"!= "x"
,这是 false。
v != "y"
变为"x"!= "y"
,这是true。
v != "z"
变为"x"!= "z"
,这是true。表达式的计算结果为
false ||真实 || true
,即true。当
v = "y"
时,表达式变为"y" != "x" || "y" != "y" || "y" != "z"
或
true ||假|| true
,即true。当
v = "z"
时,表达式变为"z" != "x" || "z" != "y" || "z" != "z"
或
true ||真实 || false
,即true。对于
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 不是“x”)
并且
(v 不是“y”)
和
(v 不是“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;
德摩根定律
作者:De Morgan's law ,表达式也可以重写为(使用类似 C 的语法)
!(v == "x" || v == "y" || v == "z")
含义
不是
((v是“x”)
或
(v 是“y”)
或
(v 是“z”))
。
这使得逻辑更加明显。
特定语言
某些语言具有用于测试集合中的成员资格的特定构造,或者您可以使用数组/列表操作。
sql :
v NOT IN ('x', 'y', 'z')
javascript :
["x", "y", "z"].indexOf(v) == -1
python :
v 不在 {"x", "y", "z"} 中
关于if-statement - 为什么一个变量与多个值的不相等检查总是返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233392/