if语句为什么一个变量对多个值的非质量检查总是返回true?
我的程序中有一个变量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" }
对于类似帕斯卡语的语言(例如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
条件中的语句总是被执行。我做错什么了吗
# 1 楼答案
使用
&&
/AND
/and
,而不是||
/OR
/or
:问题
如果总是执行
if
块,则If块的条件总是计算为true
。逻辑表达式一定是错的让我们考虑{{CD10}}的每个值^ {CD9>}。
当
v = "x"
v != "x"
变成"x" != "x"
,这是假。v != "y"
变成{v != "z"
变成{表达式的计算结果为^{,这是真的
当
v = "y"
时,表达式变为或者
true || false || true
,这是正确的当
v = "z"
时,表达式变为或者
true || true || false
,这是正确的对于
v
的任何其他值,表达式的计算结果为true || true || true
,这是真可选地,考虑真值表:
如您所见,逻辑表达式的计算结果总是^{
解决方案
你要做的是,找到一个逻辑表达式,当
(v is not "x")
and
(v is not "y")
and
(v is not "z")
正确的结构是
对于类C语言(例如c#,javascript-(可能需要严格的等式运算符
!==
),php)对于类Pascal语言plsql
德摩根定律
通过De Morgan's law,表达式也可以重写为(使用类似C的语法)
意思是
{} {}{} {}{} {}
这使得逻辑更加明显
特定语言
有些语言有特定的结构来测试集合中的成员身份,也可以使用数组/列表操作
sql:
v NOT IN ('x', 'y', 'z')
javascript:
["x", "y", "z"].indexOf(v) == -1
python:
v not in {"x", "y", "z"}
java:^{}
java-9(及以上):^{}