我的程序中有一个变量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条件中的语句始终执行。我做错什么了吗
我想我应该为Bourne shell脚本提供一个答案,因为它的语法有些奇怪
在传统的/POSIX
sh
中,字符串相等测试是[
命令的一个特性(是的,这是一个不同的命令名!),它对引用等有一些讨厌的要求像Ksh、Bash、Zsh等现代shell也有
[[
,这有点不那么麻烦我们应该强调在每个标记周围有空格的要求,这是许多初学者忽略的(即,在命令和运算符周围没有空格时不能说
if[[$v
或$v!='y'
),以及引用的明显的可选性。不引用值通常不是语法错误,但如果不引用需要引用的值,则会导致严重的语义错误。(More on this elsewhere.)这里明显的修复方法是使用
&&
而不是||
,但是您还应该注意[[
通常支持正则表达式,因此您可以说别忘了值得信赖的古老的
case
语句,这是很自然的,并且可以追溯到20世纪70年代末:尾随的双分号起初会导致动脉瘤,但你很快就会恢复,学会欣赏,甚至爱上它们。POSIX允许您在匹配表达式之前放置一个左括号,这样就不会有未配对的右括号,但这种用法相当少见
(对于非Bourne系列的Unix Shell,这显然不是一个合适的答案。C系列的Shell,包括仍然流行的
tcsh
,使用了一种被认为是“类似C”的语法但这就像无法区分爱丽丝·库珀和去仙境的女孩一样;而鱼壳有它自己的特点,我甚至无法对此发表评论。)对于PHP,您可以使用如下内容:
对于Javascript:
对于MySQL:
对于C:
还有更多的方法,我只是太懒了
发挥你的想象力,只写一个你更喜欢的
使用
&&
/AND
/and
,而不是||
/OR
/or
:问题
如果始终执行
if
块,则If块的条件始终计算为true
。逻辑表达式一定是错的让我们考虑{{CD10}}的每个值^ {CD9>}。
当
v = "x"
v != "x"
变成"x" != "x"
,这是假。v != "y"
变成"x" != "y"
,这是真的。v != "z"
变成"x" != "z"
,这是真的表达式的计算结果为
false || true || true
,这是真当
v = "y"
时,表达式变为或者
true || false || true
,这是正确的当
v = "z"
时,表达式变为或者
true || true || false
,这是真的对于
v
的任何其他值,表达式的计算结果为true || true || 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(及以上):^{}
相关问题 更多 >
编程相关推荐