3 回答

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
使用&&
/AND
/and
,不是||
/OR
/or
:
v?!=?"x"?&&?v?!=?"y"?&&?v?!=?"z"
問(wèn)題
如果if
塊,則為if塊的條件。總是評(píng)估為true
..邏輯表達(dá)式一定是錯(cuò)的。
讓我們考慮一下v != "x" || v != "y" || v != "z"
的每一個(gè)值v
.
什么時(shí)候
v = "x"
,v != "x"
成"x" != "x"
,也就是假的.?v != "y"
成"x" != "y"
,也就是千真萬(wàn)確.?v != "z"
成"x" != "y"
,也就是千真萬(wàn)確.表達(dá)式的計(jì)算結(jié)果為
false || true || true
,也就是千真萬(wàn)確.什么時(shí)候
v = "y"
,表達(dá)式變成"y"?!=?"x"?||?"y"?!=?"y"?||?"y"?!=?"z"
或
true || false || true
,也就是千真萬(wàn)確.什么時(shí)候
v = "z"
,表達(dá)式變成"z"?!=?"x"?||?"z"?!=?"y"?||?"z"?!=?"z"
或
true || true || false
,也就是千真萬(wàn)確.的任何其他價(jià)值
v
,表達(dá)式的計(jì)算結(jié)果為true || true || true
,也就是千真萬(wàn)確.
或者,考慮一下真值表:
???????│?????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
如您所見(jiàn),您的邏輯表達(dá)式總評(píng)估為true
.
解
您要做的是,找到一個(gè)計(jì)算為true
什么時(shí)候
(v is not "x")
and
(v is not "y")
and
(v is not "z")
.
正確的結(jié)構(gòu)是,
用于C類(lèi)語(yǔ)言(如。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"}
類(lèi)帕斯卡語(yǔ)言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;
德摩根定律
通過(guò)德摩根定律,表達(dá)式也可以重寫(xiě)為(使用C語(yǔ)法)
!(v?==?"x"?||?v?==?"y"?||?v?==?"z")
意義
not
((v is "x")
or
(v is "y")
or
(v is "z"))
.
這使得邏輯更加明顯。
特定語(yǔ)言
有些語(yǔ)言有特定的結(jié)構(gòu)來(lái)測(cè)試集合中的成員資格,或者可以使用數(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)驗(yàn) 獲得超8個(gè)贊
我想我會(huì)為Bourneshell腳本提供一個(gè)答案,因?yàn)檎Z(yǔ)法有點(diǎn)奇怪。
傳統(tǒng)/POSIXsh
字符串相等測(cè)試是[
命令(是的,這是一個(gè)不同的命令名!)在報(bào)價(jià)等方面有一些令人討厭的要求。
####?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等也有[[
有點(diǎn)不那么煩人。
####?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)在每個(gè)令牌周?chē)锌崭竦囊?,這是許多初學(xué)者忽略的事情(也就是說(shuō),您不能說(shuō)if[[$v
或$v!='y'
在命令和運(yùn)算符周?chē)鷽](méi)有空格),以及表觀引用的可選性。不引用值通常不是句法錯(cuò)誤,但它會(huì)導(dǎo)致嚴(yán)重的不期望。語(yǔ)義化如果你沒(méi)有引用一個(gè)需要被引用的價(jià)值,那就麻煩了。
這里最明顯的解決辦法是使用&&
而不是||
但你也應(yīng)該注意到[[
通常對(duì)正則表達(dá)式的運(yùn)動(dòng)支持,所以您可以這樣說(shuō)
if?[[?!?$v?=~?^(x|y|z)$?]];?then ????:?yeah fi
別忘了那個(gè)可靠的老人case
這是非常自然的說(shuō)法,并可移植到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
拖著的雙分號(hào)起初會(huì)導(dǎo)致動(dòng)脈瘤,但你很快就會(huì)恢復(fù),學(xué)會(huì)欣賞,甚至喜歡它們。POSIX允許在匹配表達(dá)式之前放置一個(gè)括號(hào),這樣就沒(méi)有未配對(duì)的右括號(hào),但這種用法并不常見(jiàn)。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
對(duì)于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
對(duì)于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
對(duì)于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ā)揮你的想象力,只需寫(xiě)出你更喜歡的!
添加回答
舉報(bào)