我的程序中有一个变量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
条件中的语句总是被执行。我做错什么了吗?
对于PHP,您可以使用这样的东西:
if(strpos('xyz',$v[0])===false)//example 1
//strpos returns false when the letter isn't in the string
//returns the position (0 based) of the substring
//we must use a strict comparison to see if it isn't in the substring
if(!in_array($v[0],array('x','y','z')))//example 2
//example 3
$out=array('x'=>1,'y'=>1,'z'=>1); //create an array
if(!$out[$v[0]]) //check if it's not 1
if(!preg_match('/^[xyz]$/',$v))//example 4, using regex
if(str_replace(array('x','y','z'),'',$v[0]))//example 5
if(trim($v[0],'xyz'))//example 6
对于Javascript:
javascript prettyprint-override">if(~'xyz'.search(v[0]))//example 1(.indexOf() works too)
if(!(v[0] in {x:0,y:0,z:0}))//example 2
if(~['x','y','z'].indexOf(v[0]))//example 3, incompatible with older browsers.
if(!/^[xyz]$/.match(v))//example 4
if(v.replace(/^[xyz]$/))//example 5
对于MySQL:
Select not locate(@v,'xyz'); -- example 1
select @v not in ('x','y','z'); -- example 2
-- repetition of the same pattern for the others
对于C:
if(!strstr("xyz",v))//example 1, untested
还有更多的方法,我只是太懒了。
发挥你的想象力,只写一个你更喜欢的!
匿名用户
我想我应该为Bourne shell脚本提供一个答案,因为它的语法有些奇怪。
在传统的/POSIXsh
中,字符串相等性测试是[
命令的一项功能(是的,这是一个不同的命令名!)在报价等方面有一些令人讨厌的要求。
#### WRONG
if [ "$v" != 'x' ] || [ "$v" != 'y'] || [ "$v" != 'z' ]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
像Ksh、Bash、Zsh等现代shell也有[[
,这有点不那么麻烦。
#### STILL WRONG
if [[ $v != 'x' || $v != 'y' || $v != 'z' ]]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
我们应该强调每个令牌周围都有空格的要求,这是许多初学者忽略的(也就是说,如果[[$v或$v,你不能说!='y'
命令和运算符周围没有空格),以及引用的明显选择性。没有引用一个值通常不是语法错误,但是如果你没有引用一个需要引用的值,它会导致严重的不希望的语义问题。(更多关于这个在其他地方。)
这里明显的修复方法是使用
if [[ ! $v =~ ^(x|y|z)$ ]]; then
: yeah
fi
不要忘记值得信赖的旧case
语句,这是非常自然的,并且可以追溯到20世纪70年代末:
case $v in
x | y | z)
;; # don't actually do anything in this switch
*) # anything else, we fall through to this switch
yeah
some more yeah
in fact, lots of yeah;;
esac
拖尾的双分号起初会导致动脉瘤,但你会很快康复,学会欣赏,甚至爱它们。POSIX允许您在匹配表达式前放一个开括号,这样您就不会有未配对的右括号,但是这种用法相当不常见。
(对于非伯恩家族的Unix shell来说,这显然不是一个合适的答案。外壳的C家族——包括仍然有些流行的tcsh
——使用一种被认为是“类似C”的语法,但这就像无法区分爱丽丝·库珀和去仙境的女孩;鱼壳有它的自己的特点,我甚至没有能力评论。)
使用
v != "x" && v != "y" && v != "z"
如果始终执行
If
块,则If块的条件始终计算为true
。逻辑表达式一定是错的。
让我们考虑
v!="x"||v!="y"||v!="z"
为v
的每个值。
>
当
v=“x”
时,
v!="x"
变成"x"!="x"
,这是false.v!="y"
变成"x"!="y"
,这是真的。v!="z"
变成"x"!="z"
,这是真的。
表达式的计算结果为
false | true | true
,即true。
当
v=“y”
时,表达式变为
"y" != "x" || "y" != "y" || "y" != "z"
或
true||false||true
,这是true。
当
v=“z”
时,表达式变为
"z" != "x" || "z" != "y" || "z" != "z"
或者
true | | true | | false
,这是真的。
对于
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
如您所见,逻辑表达式的计算结果总是
true
。
您要做的是,找到一个逻辑表达式,当
(v不是“x”)
和
(v不是“y”)
和
(v不是“z”)
。
正确的构造是,
>
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;
根据德摩根定律,表达式也可以重写为(使用类C语法)
!(v == "x" || v == "y" || v == "z")
意思
不是
((v是“x”)
或
(v是“y”)
或
(v是“z”)
。
这使得逻辑更加明显。
有些语言有特定的结构来测试集合中的成员资格,或者您可以使用数组/列表操作。
>
sql:
v不在('x','y','z')
javascript:
[“x”、“y”、“z”]。indexOf(v)=-1
python:
v不在{“x”、“y”、“z”}
java:
!数组。asList(“x”、“y”、“z”)。包含(v)
java-9(及以上版本):
!设置属于(“x”、“y”、“z”)。包含(v)
问题内容: 我想检查一个变量是否具有多个值之一。我对为什么在这种情况下不起作用感到困惑。我正在按照给出该示例的教程进行操作,但是当我尝试执行此操作时,它只会根据第一个值检查变量。我的支票怎么了? 问题答案: (“Jesse” or “jesse”) 上面的表达式测试是否评估为。如果是这样,则表达式将返回它;否则,它将返回。该表达式等同于编写: 因为是一个非空字符串,所以它将 始终 求值为并因此返回
我一直在想一些初学者的错误,最后我犯了语句中的错误。我对代码进行了一些扩展: 我已经看到语句返回true,它
我试图创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成Python。那么说: 它将返回以下列表: 这样的事情可能吗?
初学者问题,很抱歉,如果这不是一个合适的地方,请尝试学习在中逻辑是如何工作的,我无法理解这一点 我希望它会说“是的!”如果是A、A、D或D,而是z,但出于某种原因,它会说“是的!”无论第一个符号是什么,都会断开,并且只检查第二个符号是否为z。
问题内容: 我有限的大脑无法理解为什么会这样: 在PHP中,等效比较返回false: 问题答案: 从文档中: 对于Unicode和字符串类型,当且仅当 x 是 y 的子字符串时,才为true 。等效测试为。注意, x 和 y 不必是同一类型;因此,将返回。 空字符串始终被视为任何其他字符串的子字符串,因此将返回。 通过查看呼叫,您正在使用2.x。 要更深入,请看一下字节码: 是我们进行布尔运算并查