至此,我們學(xué)習(xí)了邏輯的基本知識。邏輯上只使用真(true)和假(false)兩個值進(jìn)行運(yùn)算。命題非真即假,非假即真。
三句話不離本行,這就談?wù)勎覀兯P(guān)心的程序。程序經(jīng)常會由于發(fā)生錯誤,導(dǎo)致退出、崩潰、陷入無限循環(huán)、拋出異常等情況,得不到true和false中的任何一個值。
為了同樣能表示這種“得不到值”的情況,在原有的true和false基礎(chǔ)之上,又新引入了一個叫undefined的值。undefined意為“未定義”。
true 真
false 假
undefined 未定義
下面我們一起來思考使用true、false、undefined的三值邏輯。
在實(shí)際編程中經(jīng)常會出現(xiàn)未定義的邏輯。我們這就來看看未定義邏輯的下面幾種情況。
一、帶條件的邏輯與(&&)
我們一起來思考一下三值邏輯中的邏輯與(帶條件的邏輯與,conditional and,short-circuit logical and)。使用運(yùn)算符&&,將A和B的帶條件的邏輯與表示為:
A&&B
我們?nèi)匀皇褂谜嬷当韥矶x運(yùn)算符&&。不過,與先前有所不同,這回使用true/false/undefind三種值。(圖2-34)
通過真值表,我們能得出下述結(jié)論:
不包含undefined的行,和邏輯與A∧B相等。
- A為true時,A&&B和B相等。
- A為false時,A&&B恒為false。
- A為undefined時,A&&B恒為undefined。
- 從左往右閱讀圖2-34中的每一行,將undefined解讀為“這里計算機(jī)不進(jìn)行任何處理”,就能馬上理解上面的結(jié)論了。
- A為true時,看B。B的結(jié)果就是A&&B的結(jié)果。
- A為false時,不用看B結(jié)果為false。
- A為undefined時,計算機(jī)不進(jìn)行任何處理,因此不用看B,A&&B的結(jié)果也為undefined。
這個&&,和C、Java中的運(yùn)算符&&意思相同。
我們繼續(xù)看下面的程序。
if(A&&B){
...
}
A為flase時,A&&B必為false。A為true時,A&&B的值等于B。這就是說,在判斷A&&B的真?zhèn)螘r,應(yīng)根據(jù)條件A判斷是否需要看B(因此稱為帶條件的邏輯與)。這其實(shí)和下面的條件語句是相同的。
if(A){
if(B){
...
}
}
而A&&B并不等于B&&A,因此所謂的交換法則不成立。
運(yùn)算符&&可以用于下面的邏輯。
if(check() && execute()) {
...
}
這時,若函數(shù)check()的值為false,就不執(zhí)行execute()了。這里的check()起到了檢查可否執(zhí)行execute()的作用。
二、帶條件的邏輯或(‖)
同樣,我們來看一下三值邏輯中的邏輯或(帶條件的邏輯或)。使用運(yùn)算符‖,將A和B的帶條件的邏輯或表示為(圖2-35)。
A‖B
A為true時,A‖B必為true;A為false時,A‖B的值等于B。即
if(A‖B){
...
}
和下面的程序是一樣的:
if(A){
...
}else{
if(B){
...
}
}
三、三值邏輯中的否定(!)
三值邏輯中的否定用!來表示,即A的否定式寫作
!A
就這么簡單(圖2-36)!
四、三值邏輯的德·摩根定律
至此,三值邏輯的邏輯與、邏輯或以及否定都講完了,下面就能探究三值邏輯的德.摩根定律了。我們借助真值表來判斷下述兩個等式能否成立(圖2-37)。
(!A)‖(!B)=!(A&&B)
(!A)&&(!B)=!(A‖B)
我們根據(jù)真值表得知德·摩根定律在三值邏輯中確實(shí)也成立。
運(yùn)用德·摩根定律,可將if語句進(jìn)行如下變形。
if(!(x >=0 &&y>=0)){
...
}
↓
if(x<0‖y<0)){
...
}
囊括所有了嗎
如果要列舉所有涉及true/false/undefined的邏輯運(yùn)算符,數(shù)量將達(dá)到3的9次方個,因此這里60
不再贅述。本節(jié)介紹的是編程中常用的運(yùn)算符&&、‖以及!。
更多建議: