包含未定义的逻辑
至此,我们学习了逻辑的基本知识。逻辑上只使用真(true)和假(false)两个值进行运算。命题非真即假,非假即真。
三句话不离本行,这就谈谈我们所关心的程序。程序经常会由于发生错误,导致退出、崩溃、陷入无限循环、抛出异常等情况,得不到true和false中的任何一个值。
true 真
false 假undefined 未定义
在实际编程中经常会出现未定义的逻辑。我们这就来看看未定义逻辑的下面几种情况。
- 带条件的逻辑与
- 待条件的逻辑或
- 否定
- 德·摩根定律
一、带条件的逻辑与(&&)
我们一起来思考一下三值逻辑中的逻辑与(带条件的逻辑与,conditional and,short-circuit logical and)。使用运算符&&,将A和B的带条件的逻辑与表示为:A&&B
我们仍然使用真值表来定义运算符&&。不过,与先前有所不同,这回使用true/false/undefind三种值。(图2-34)
通过真值表,我们能得出下述结论:
不包含undefined的行,和逻辑与A∧B相等。
- A为true时,A&&B和B相等。
- A为false时,A&&B恒为false。
- A为undefined时,A&&B恒为undefined。
- 从左往右阅读图2-34中的每一行,将undefined解读为“这里计算机不进行任何处理”,就能马上理解上面的结论了。
- A为true时,看B。B的结果就是A&&B的结果。
- A为false时,不用看B结果为false。
- A为undefined时,计算机不进行任何处理,因此不用看B,A&&B的结果也为undefined。
这个&&,和C、Java中的运算符&&意思相同。
我们继续看下面的程序。
if(A&&B){
...
}
A为flase时,A&&B必为false。A为true时,A&&B的值等于B。这就是说,在判断A&&B的真伪时,应根据条件A判断是否需要看B(因此称为带条件的逻辑与)。这其实和下面的条件语句是相同的。
if(A){
if(B){
...
}
}
而A&&B并不等于B&&A,因此所谓的交换法则不成立。
运算符&&可以用于下面的逻辑。
if(check() && execute()) {
...
}
这时,若函数check()的值为false,就不执行execute()了。这里的check()起到了检查可否执行execute()的作用。
二、带条件的逻辑或(‖)
同样,我们来看一下三值逻辑中的逻辑或(带条件的逻辑或)。使用运算符‖,将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)
我们根据真值表得知德·摩根定律在三值逻辑中确实也成立。
运用德·摩根定律,可将if语句进行如下变形。
if(!(x >=0 &&y>=0)){
...
}
↓if(x<0‖y<0)){
...
}
囊括所有了吗
如果要列举所有涉及true/false/undefined的逻辑运算符,数量将达到3的9次方个,因此这里60
不再赘述。本节介绍的是编程中常用的运算符&&、‖以及!。