00:00
接下来我们要讲解的是逻辑运算符啊,那逻辑运算符呢,其实跟前面我们讲到的关系运算符有很大的关联,因为前面我们讲关系运算符的时候,大家发现了啊,其实就是判断。一些值,一些变量,它们之间的大于小于等于或者不等于这样的一些关系,那它其实可以作为代码里边逻辑判断的一个条件,那我们自然想到了,那假如说我们逻辑里边是有多个条件呢,怎么样把不同的条件组合起来,最后得到一个最终的结果呢?啊,就比方说我们的这个呃判断啊,我们我们怎么样的情况下去处理下面的逻辑,我是有很多个条件要他们同时发生的时候,我才去执行下面的这一段逻辑代码,那这相当于是什么呢?这就是一个条件的逻辑语,那那假如说我要判断的是很多个条件,只要里边发生一个,那接下来我就要执行接下来的这段代码,那所以这就相当于是一个逻辑或啊,那所以这里边我们的逻辑运算符呢,就是用来连接多个条件的,那每一个条件呢,一般来讲就是一个关系表达式了,那所以它连。
01:15
承接了多个结果是除false的布尔类型的值,那最终经过逻辑运算之后得到的当然也是一个除false的值了,主要就做这个条件判断,呃,那这里边大家需要注意就是逻辑主要就是与或非与和或。它是二元运算符,而逻辑非呢是一元运算符,那在形式上表示的也非常的明显,逻辑与逻辑或都是有两个,呃,两个看起来这个字符表示的啊,这里边的逻辑与它是两个语号,一个语号就是一个and符,而逻辑或呢是两个竖线啊,就是这个竖线,就是我们所谓的这个逻呃祸福,所以对于这个逻辑语而言,我们说是所有的条件都为真的时候,最终的结果才为真啊,那大家就看到了啊,就是A和B,假如里边有一个为false,那最后的结果就是false,只有所有的都为真,最后的结果才为真,而逻辑或呢,呃,他所说的是只要里边有一个条件为真,最后的结果就为真,那A和BA是处,那么最后的结果就是处了。
02:22
它只有在所有的条件都为假的时候,最后的结果才为假,那对应的这个逻辑非就非常简单啊,就是一个感叹号表示后边这个表达式如果为真。取飞之后就是假,如果为假,取飞之后就是真啊,这是关于逻辑运算符的一个基本用法,比较简单啊,那这里要给大家强调的一点是什么呢?就是这里的逻辑语和逻辑货,大家要跟后边我们要讲到的未运算里边的谓语和谓货区分开来啊,因为大家知道如果这一个语号和括号啊,如果不写两个,只写一个的话,它也是一个合法的表达式,它也是一个运算符,这是一个未运算符啊,那么它做的操作呢,是把前后的两个变量里边的每一位分别做逻辑与和或的运算,那这个逻辑运算它就不是除号false的运算了,而是为每一位上零和一的这样的一个计算啊。那所以其实这两种呃,在逻辑判断上还是有本质的区别的啊,尽管有时候,呃,有些同学可能就是对他们不做区分,直接在逻辑判断里边,也有时候直接用那个谓语未获的符。
03:34
符号直接去用了啊,但是他们本质还是不一样的,那具体在使用的过程当中呢,它们还有一个非常明显的区别,那就是我们所说的逻辑运算符有短路特性啊,就是说如果说我们前边这个逻辑语啊,以逻辑语为例,我们不是说必须是所有的条件都为真,都为处,最后结果才为处吗?那假如说我们第一个条件就已经为假了。
04:04
那其实我们都已经不用判断后面了,后面不管它是真还是假,已经有一个为假,那最终结果一定为假对吧?啊,那或者这个逻辑或也是一样啊,如果第一个条件我已经判断出来它为真,那后面其实就不用考虑了,只要有一个为真,最后结果一定为真嘛,所以对于逻辑判断而言,我们的底层在处理这个代码的时候也是这样,就只要第一个条件已经能判断出来了,那后边的这个表达式呢,根本连它的值都不会去做计算啊,就是这段代码就根本不会执行。所以我们往往有时候就会利用它的这个特点,实现一些特别的逻辑控制啊,那我们管这个特性叫做短路计算啊,这个逻辑运算符是有这个特性的,而未运算符就没有这样的特性,那接下来我们就在代码里边给大家做一个。做一个具体的测试啊,做一个基本的直线,我们可以看一看你是怎么一回事,逻辑运算图,那首先我们可以做一个简单的测试,就是比方说我这里边可以定义一个,这样N取一,然后接下来呢,呃,我们可以比方说啊,直接做一个一个打印,我们直接判断一个表达式啊,那它到底是出false,那这里边的这个表达式呢,我可以直接一个四大于五,哎,那其实大家知道前面只要有一个四大于五。
05:43
那其实。它肯定是为为甲为false对吧,那如果后边我要做一个与啊逻辑运算的话,其实后边都不用做了工作判断了,最后的结果一定是false,哎,那所以我们想看后边这部分代码会不会执行的话,我可以单独的再来定义一个方法,比说我们定一个TF啊,定一个M,还一个参数进来,一个int的参数进来,然后呢,返回一个int的值。
06:16
然后在这之前呢,我要先去打印一句话,就是M被调用,然后后边直接return前传进来的这个N就是非常简单的一个实现啊,我们最后要返回一个int类型了,所以接下来呢,哎,这里边我们就直接用一个M,比方说我们要做逻辑判断啊,那它是否大于零,那其实大家知道后边这个把N与一传进来的话,返回一,这个确实是大于零的,这个是为触的,但是这里边的这个MN到底会不会被调用呢?那我们来运行一下看一看。
07:01
大家看到啊,当然前面我们这个是有上边的这个区分啊,我们可以直接定一个分割线。看的会更加的明显一点。我们看一下这里输出的直接就是false,没有M被调用的输出,说明后面这段代码根本就不会被执行啊,也就是说我们做了一个短短路的判断,前面这里是false,那直接输出false就完了。当然,如果这里我们是四小于五的话。后边显然就是M会被调用一次,然后最终输出一个处,哎,这就是我们能够看到这个短路执行的一个特点啊啊,当然了,如果说我们还是这样一个短路执行,但是呢,在做这个逻辑判断的时候,如果大家偷懒,你只写了一个语号,那这个其实本质上它是一个暗卫语,那大家看一下它会短路执行吗?这个当然就不会了,对吧?啊,就尽管最后的结果还是false,还是他会把前后两个表达式的值都要计算出来,然后再去做按位语,因为大家知道按位嘛,那你至少要两个变量啊,就每一位都得计算出来,你才能做这个按位计算,所以它是不会去短路的啊,大家要把这个区分开,其实本质上这个一个语号它就不是做逻辑判断的,可推荐大家在做逻辑判断的时候呢,还是尽量使用两个语号这个逻辑运算符啊,这是关于短路的这个特性啊,那这个特性我们往往在实际使用的时候呢,用的更多的,这这个场景到底是什么,什么地方呢?一个我们可以给大家举一个实际意义,使用过程当中非常常见的例子啊,就是判断一个字符串是否为空,那其实比方说我们这里边可以定义一个empty去做一个判断啊。
09:00
那或者我还可以判断是否不为空是吧?Is not empty,那大家知道,如果是is empty的话,那就是为空的时候,返回处不为空的时候返回false,那假如我们定义的是is not empty不为空的话,那应该是不为空的时候,返回处如果真的为空,那应该返回false。哎,那当当然了,它应该有一个参数,就是一个string了,对应既然要做判断嘛,返回的值当然是一个布尔类型的值了,那大家非常容易想到最简单的写法当然就是直接特判断当前的值是否为空嘛,那我就看这个string,呃,我们直接去。是否equals啊,就是大家知道现在我们在这个GALA里边啊,你直接去直接去用这个等号也相当于equals啊,大家如果习惯equal口S的话,Equals也是可以的,那我就直接看它是否等于空字符串不就完了吗?哎,但是这里要注意啊,等于空字符串它是为空对吧?它为空的时候,我们这个其实是要判断不为空,所以其实为空的时候我要返回false,哎,所以这里边我应该再加上一个逻辑取反的这样的一个条件,就是大家能想到的最简单的实现,那这种实现是有问题的,那这种实现大家会想到那string本身。
10:23
它是一个这个引用类型啊,如果说我们传进来这个string直接就是一个nu呢,这是不是也相当于当前传进来的这个字符串视为空了啊,那在这种情况下,我也应该不应该直接报错,而是应该返回返回处它,呃,返回false对吧,因为它为空啊,那一字not em应该返回false,那现在呢,你如果要是它直接为nu的话,这里就直接抛空指针异常了啊,这里就直接肯定就你直接判断它是否跟这个相等,这里肯定就就直接报异常嘛,对吧?呃,这里就是大家会想到,因为它底层是这个点E口子这个方法,那怎么样避免这样的一个使用的这样的一种报异常的情景出现呢?
11:05
啊,在Java里边我们也经常这么干啊,我们是不是可以把它反过来,直接在前边先用这一个字符串常量,然后去用它来调用一个E方法里边弹进来,啊,传的是我们目前的这个字符串,对吧。这样的话就可以避免的一种触碰,但是即使是这样的一个做法,大家会想到,如果要考虑的。场景更复杂的话,我们会想到,那还有可能这里边这个字符串里边它是不为呢啊,但是呢,里边有可能有空格啊,有可能有一些空白字符,那这种情况下,我们可能逻辑判断它也应该是空,那应该怎么办呢?哎,那就相当于是不是还应该去除一个空白字符啊,要一个train方法把in的空白字符都去掉。但是接下来这个问题就又来了,那大家看,既然你后边又要调用这个点stream,那如果说这个时候string真的是none的话,这就不对了呀,这又是要调用string的方法,呃,那不就抛空指针异常了吗?你相当于前面我们这样调这个空字符串的这个E口方法就没有起到作用嘛,怎么样避免这个string为nu呢?
12:21
那干脆我们前面就加一个条件吧,就得判断。如果当前的这个运。大家会想到啊,如果它真的为nu的话,那其实我应该是这就应该直接返回一个,直接返回一个false,那如果它不为囊的话,我们就可以返回一个处啊,那所以我其实要判断的这个条件就是它不为nu,然后如果它不为囊,还不能直接返回处,呃,大家要注意啊,就是如果为囊的话,是直接返回false,那不不为囊的话,是不是还得要求后边满足这个条件啊,啊,就是去除空格之后,它还得不等于这个空字符空字符串,这样的话才是真正返回处,所以我们发现这两个条件是。
13:09
并且的关系与的关系,所以我们就用一个逻辑语把它们放在一起,那大家会发现你要这么去做判断的话,难道就可以避免后边调用这个string方法了吗?假如说他真的为囊的话,你后边这里的表达式不还是一个string.stream吗?啊,那这种情况是不是它就判断不出来了呢?还是抛空指针异常了呢?那其实不是的,我们提到本身这里是一个短路语的计算,所以假如string真的为nu的话,那那不用说是不是后边这个就根本不会执行啊,所以他一判断这里真的为none了,是不是直接就返回了,那这里是false嘛,所以逻辑语只要有一个为甲,直接返回甲就可以了,后面不做计算。我们可以简单的做一个测试,就直接not empty,我们把一个not传进来,大家可以看一下,把它做一个打印。
14:07
看看结果到底是抛出异常还是正常的,可以返回为空啊,那那这里边你既然传了一个囊进来,那应该是真的为空了,应该返回一个false,我们看一下是否正确。大家看没有问题,可以正常返回false,对吧?这就是短路与这种短路逻辑运算最常见的用法。这就是关于这个逻辑运算这一部分啊,跟Java基本是一致的,大家可以回顾一下。
我来说两句