3 回答

TA貢獻(xiàn)1808條經(jīng)驗 獲得超4個贊
使用&&
/AND
/and
,不是||
/OR
/or
:
v?!=?"x"?&&?v?!=?"y"?&&?v?!=?"z"
問題
如果if
塊,則為if塊的條件。總是評估為true
..邏輯表達(dá)式一定是錯的。
讓我們考慮一下v != "x" || v != "y" || v != "z"
的每一個值v
.
什么時候
v = "x"
,v != "x"
成"x" != "x"
,也就是假的.?v != "y"
成"x" != "y"
,也就是千真萬確.?v != "z"
成"x" != "y"
,也就是千真萬確.表達(dá)式的計算結(jié)果為
false || true || true
,也就是千真萬確.什么時候
v = "y"
,表達(dá)式變成"y"?!=?"x"?||?"y"?!=?"y"?||?"y"?!=?"z"
或
true || false || true
,也就是千真萬確.什么時候
v = "z"
,表達(dá)式變成"z"?!=?"x"?||?"z"?!=?"y"?||?"z"?!=?"z"
或
true || true || false
,也就是千真萬確.的任何其他價值
v
,表達(dá)式的計算結(jié)果為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
如您所見,您的邏輯表達(dá)式總評估為true
.
解
您要做的是,找到一個計算為true
什么時候
(v is not "x")
and
(v is not "y")
and
(v is not "z")
.
正確的結(jié)構(gòu)是,
用于C類語言(如。C#,?JavaScript-(可能需要嚴(yán)格的相等操作符
!==
),?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'?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;
德摩根定律
通過德摩根定律,表達(dá)式也可以重寫為(使用C語法)
!(v?==?"x"?||?v?==?"y"?||?v?==?"z")
意義
not
((v is "x")
or
(v is "y")
or
(v is "z"))
.
這使得邏輯更加明顯。
特定語言
有些語言有特定的結(jié)構(gòu)來測試集合中的成員資格,或者可以使用數(shù)組/列表操作。
JavaScript:?
["x", "y", "z"].indexOf(v) == -1
Python:?
v not in {"x", "y", "z"}
爪哇:?
Arrays.asList("x", "y", "z").contains(v)
爪哇-9(及以上):
Set.of("x", "y", "z").contains(v)

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
我想我會為Bourneshell腳本提供一個答案,因為語法有點奇怪。
傳統(tǒng)/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
現(xiàn)代貝殼如Ksh,Bash,Zsh等也有[[
有點不那么煩人。
####?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
我們應(yīng)該強(qiáng)調(diào)在每個令牌周圍有空格的要求,這是許多初學(xué)者忽略的事情(也就是說,您不能說if[[$v
或$v!='y'
在命令和運(yùn)算符周圍沒有空格),以及表觀引用的可選性。不引用值通常不是句法錯誤,但它會導(dǎo)致嚴(yán)重的不期望。語義化如果你沒有引用一個需要被引用的價值,那就麻煩了。
這里最明顯的解決辦法是使用&&
而不是||
但你也應(yīng)該注意到[[
通常對正則表達(dá)式的運(yùn)動支持,所以您可以這樣說
if?[[?!?$v?=~?^(x|y|z)$?]];?then ????:?yeah fi
別忘了那個可靠的老人case
這是非常自然的說法,并可移植到1970年代后期:
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
拖著的雙分號起初會導(dǎo)致動脈瘤,但你很快就會恢復(fù),學(xué)會欣賞,甚至喜歡它們。POSIX允許在匹配表達(dá)式之前放置一個括號,這樣就沒有未配對的右括號,但這種用法并不常見。

TA貢獻(xiàn)1744條經(jīng)驗 獲得超4個贊
對于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:
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
有更多的方法,我就是太懶了。
發(fā)揮你的想象力,只需寫出你更喜歡的!
添加回答
舉報