之前我们介绍了运算表达式,知道了运算表达式可以给我们一个运算后的具体值。
我们也介绍了条件表达式,知道了条件表达式可以给我们一个成立/不成立的结果,也就是true/false。
本节我们在条件表达式的基础上,介绍逻辑表达式。
1、基础知识
这里我们简单回顾一下条件表达式:
这时我们需要观察,无论我们使用算数运算符、赋值运算符还是条件运算符的时候,对应的表达式要干啥取决于表达式中的运算符,但是操作的却是运算符两边的操作数。
之前我们在使用操作数的时候,都是确定的内容,要么是数字,要么是对应的变量。
但是当我们使用逻辑运算符的时候,对应的操作数的位置,却是表达式。
逻辑运算符有三个:
&& 与
|| 或
! 非
我们使用逻辑表达式的&&和||的结构是:(表达式1)逻辑运算符(表达式2)
比如:
而这里逻辑运算符的意义是:
&& 与:当运算符左右同时成立的时候,整体表达式成立
|| 或:当运算符左右两边,只要有一边成立,整体表达式成立
我们看上面的例子:其中b>a成立但是a==b不成立,那么整个表达式便是(成立&&不成立),那么最后整体的结果当然是不成立(false)喽。
我们将代码简单修改:
在这里,我们将&&更换成了||,这时整体的结果是成立,这是为什么呢?
因为现在的表达式是(成立||不成立),通过||的定义我们知道,只要这个运算符左右两边只要有一边成立,那么整体就成立。
我们再看两个例子:
其中,第一个例子中整体表达式意思是(不成立&&不成立),那么依据&&的意思,整体表达式是不成立的。
第二个例子中整体表达式的意思是(不成立||不成立),那么依据||的意思,整体表达式是不成立的。
那么接下来我们来看第三个逻辑运算符:
! 非:否定表达式
这个逻辑运算符的操作数只有一个,那么否定表达式的意思便是,如果操作数位置上的表达式是成立的,那么整体表达式就是不成立的,如果操作数位置上的表达式是不成立的,那么整体表达式就是成立的。
我们看代码:
这时我们明显知道,b是大于a的,那么这个时候,b<a这个表达式就是不成立的,那么既然!是否定的意思,那么否定不成立就是成立的意思喽。
2、基础引申,连续比较
现在我们知道了,逻辑表达式,就是先判断表达式两边的操作数的状态,然后给出整体状态。
那么我们看如下代码:
那么这两个例子是怎么回事?
我们逐一分析:
第一个例子中,我们通过整理看到(不成立&&不成立&&成立),通过&&的意义我们从左向右分析结果,((不成立&&不成立)&&成立)因为&&操作的是两边的操作数,那我们先看前面的,我们这时将(不成立&&不成立)看成一个整体,这个整体结果是不成立,然后我们将结果带入后面的运算,就变成了(不成立&&成立),这个结果是不成立,那么整体(不成立&&不成立&&成立)就是不成立喽。
第二个例子,我们也用同样的分析方式,(不成立||不成立||成立),这时先将前面的不成立||不成立看成整体,这个整体是不成立,然后将这个结果带入后面,就是(不成立||成立),这时我们依据||的意思得到的结果是成立,那么整体(不成立||不成立||成立)就是成立喽。
我们用这两个例子来说明,逻辑表达式是可以连续的,但是遇到连续的情况的时候,因为我们知道这时表达式是操作运算符左右两边的操作数的,那么我们可以在分析的时候,将不同的部分看成不同的整体,进而通过拆分、合并分析的方式进行代码分析。
3、基础引申,利用运算符特点进行运算
我们看代码:
这时我们发现,咦,为啥age的结果不一样?
在这里,我们需要特别关注一下||,它的定义是只要两边有一边是true,那么整体返回true。
那么只要有一边,就是说,一旦程序发现||的左边是true那么直接判定整体为true,就不管||是什么情况了。
那么我们细化第一个例子:
(day < birthday) || (++age > 18)带入具体内容为,(3<2)||(19>18)
细化第二个例子,便是(3>2)||无需判断
那么就是说,第一个例子中,我们判断||左边不成立,于是运行||的内容,而右边的内容中有自增运算符,所以右边进行了一次运算。
但是在第二个例子中||左边成立,所以直接判定整体成立,就不用管右边了,所以右边没有执行。
这里,我们发现了||运行的特殊之处,但是这有什么用呢?
比如,我们将上述两个例子,变成具体的实际程序需求:一个人的年龄18岁,他的生日是本月2号,我们的要求是用程序判断当前日期,如果当前没有到2号,他仍然是18岁,如果当前超过2号,那么这个人就长了一岁,变成了19岁。
这时我们在看看上面的例子,是不是有种恍然大明白的感觉!