包含未定义的逻辑

2018-08-09 19:15 更新
至此,我们学习了逻辑的基本知识。逻辑上只使用真(true)和假(false)两个值进行运算。命题非真即假,非假即真。

三句话不离本行,这就谈谈我们所关心的程序。程序经常会由于发生错误,导致退出、崩溃、陷入无限循环、抛出异常等情况,得不到true和false中的任何一个值。


为了同样能表示这种“得不到值”的情况,在原有的true和false基础之上,又新引入了一个叫undefined的值。undefined意为“未定义”。


true                      真

false                     假

undefined            未定义


下面我们一起来思考使用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
不再赘述。本节介绍的是编程中常用的运算符&&、‖以及!。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号