那么说了关系运算符呢，我们来看一下逻辑运算符。
逻辑运算符呢，我们既陌生，又熟悉。
之所以陌生，是因为真的我们以前没用过。在程序里头我们也没去使用它。
那之所以它熟悉呢，是因为我们在讲计算机基本原理，
也就是我们这一课的第一讲的时候，其实我们已经提到了。
照我们讲的布尔运算的时候。其实呢，这里的
逻辑运算符跟那里的布尔运算，它的意义是相同的。
那么在 C 里面拥有三种最基本的逻辑运算。
哪三种啊 ？ 与，或， 非。它的基本含义，我们其实已经讲过了。如果是与的话，就相当于两个开关给串联起来。
必须它们都闭合以及两个值都为真，那么，
A 与 B 的值才有可能是真，那这个灯才有可能亮起来。
如果是 ‘或‘ 运算呢，那 A 与 B 的值只要有一个是真的，
那么这个灯就亮了，那么最后这个表达式的值也就为真了。 如果是
‘非‘ 运算呢那更好办了，如果 A 是假，那么 非A 就是真。
如果 A 是真， 非 A 就是假。那么这个是基本的逻辑运算的含义。
好我们不需要再作更多的解释了。 那么当然了，由逻辑运算就可以组成逻辑运算表达式。
那个逻辑运算表达式也是有值的。而且呢，逻辑运算表达式的值也是只有两个。
要么是真，要么是假。啊，我们来看几个例子。
比方说，如果 a = 4， 我们来计算逻辑运算表达式 非 a 的值。 那非
a 式的话， 因为 a = 4 ， 这是一个非
0 的值。 那非 0 呢，就是真。所以 a 是真，所以非
a 那是假。也就是非 a 的值应该是 0。 啊这样特别小心。
那如果，第二个，如果 a = 4， b = 5 ，
那么 a 与 b 的值是多少呢? 啊，因为 a 和 b 都是非
0 的， 所以说都是真。所以说 a 与 b
的值应该是 1。 那么，第3个， 若 a = 4.
b = 5, 那么 a 或 b 的值应该是多少呢 ？ 因为 a 和 b 都是非
0, 所以 a 或 b 的值也是 1。 a = 4,
b = 5, 那么， 非 a 或 b 的值应该是多少呢? 当然， 非 a
应该是 0， 但是 b 的值应该是 1。 所以， 非 a 或
b 的值应该是 1。那有的同学可能问了，
啊，那么在这里头也出现了两个运算符啊。那么，一个运算符是非
a, 是这个非， 另一个运算符是
‘或’ ， 那你这个算法就是先算了非a， 然后再算 ‘或‘， Ok,
是这样的，待会儿我们再说。再看底下这个表达式。 4 与 0 或 2，
啊它的值， 这个值呢， 你看也是 1。为什么呢， 由或运算，
然后呢，或运算后面， 2 是个非0 的值， 所以说那值一定是 1。
为什么要这么算呢，我们往后看，就知道了。
看一下，逻辑运算符的优先级。
首先我们看一下几个逻辑运算符本身的优先级。 其实，别看逻辑运算符只有 3
个，但它们之间仍然有很强的优先级顺序。 那么，逻辑运算符之间是
‘非‘ 运算优先级最高，
其次是 ‘与‘ 运算， 再次是 ‘或‘ 运算。
所以啊，它们三个有着不同的运算符优先级。而且呢， ‘非‘
的运算优先级是最高的。 Ok, 我们看几个例子,我们来体验一下。
第一个例子， 非 a 与 b 或 c, 那这个式呢应该怎么算 ？
那当然先算 非 a, 啊然后再算 非 a 与 b, 然后再算 ‘或’ c。应该这么算。
这是最后一个式子，最后一个式子啊，比较复杂。
那么出现的运算符非常非常多。除了逻辑运算之外，
还有关系运算，还有算术运算。那这怎么办?
这样的话，我们就必须要搞清楚
逻辑运算，和算术运算，关系运算，以及赋值运算， 它们之间的运算符优先， 优先级的关系。
我这儿呢有张图，它表示它们之间的关系。 啊，由高到低，排序是这样的。
那最高是 ‘非‘，然后呢，是算术运算符，然后呢，是关系运算符，
然后，是 ‘与‘ 和 ‘或‘， 而且‘与‘ 和 ‘或‘
的优先级 还是不同的。最后才是赋值语句。
看上去稍微有点乱。但是，其实在用的时候你会发现，
它呀，非常符合我们日常的思维的逻辑判断的方式。
我们先看一个简单的例子。啊，比方说， a > b 与上 x
> y ， 这个怎么算 ？ 是不它就相当于
a > b 与上 xy， 因为我们要先算关系运算。
最后再算这个 ‘与‘ 运算。
再看下面，也一样的， a = = b, x = = y, 那么也是相当于 a =
b 括起来，或上 x = = y, 第三个， 非
a 或 a > b, 那这个也是一样， 非 a 是一边，a > b 是一边,然后再计算。
通过这个我们就可以感受出来，在我们
对运算符优先级还掌握得不是特别好的情况下，我们有一个很好的办法,
来确保我们写的不会错。那怎么办 ？ 加括号呀。那么在你不是特别确定的情况下，
就可以通过加括号的方法来解决这个问题。 Ok,
那么，看完了简单的呢，我们再看一道稍微难一点的。看这个情形。
那在这个情形里头呢，首先第一呢，两个变量，a = 0, b = 0,
然后呢，给出来了一个 长长的表达式。
啊这个表达式可是够长的。对于这样的一个表达式，
我们先来看应该怎么去计算，然后我们再来分析它的结果。
去看这样的一个表达式，这个表达式应该怎么去计算啊 ?根据我教给大家的这个砍刀法，
再长的表达式我们都不怕。我们只要搞清楚了运算符的优先级顺序，就好办了。
啊，对这样的一个表达式，应该怎么算 ？很简单，第一刀，肯定是要在赋值语句那儿砍，砍开，
然后呢，先算右边。
那么第二刀，啊要，砍了赋值语句了我们就要砍逻辑运算符了。
那么逻辑运算符自身又有它的运算符优先顺序，我们知道，
‘或‘ 运算的运算符优先顺序是最低的，所以说第二刀砍在这里。
又砍成了两边，那先算这一边。
算这一边呢，又是一个子的表达式，那这个表达式呢， 当然毫无疑问，从这儿，从与运算砍开。
然后呢，再去算先算这边，这边就不用砍了。5 > 3 ，
得 1，然后呢，与 2，1与2 的结果肯定是 1， 对不对?
所以说，我们知道，那么这个或运算，
这一边，或运算的整个这一边的结果都是
1。 当两个数作 ‘或‘ 运算，并且其中有一个的已经是 1
了，对不对？ 那我们还用再继续算后面的吗 ？还需要算这边的吗 ？
不需要了，我们一下子就可以知道这个值了。
所以说，整个这个表达式的值，算下来是 1。那 a 的值也是
1。 那么在这儿需要特别搞清楚的是 b 的值。
在刚才的计算过程中，我们仍没去算的时候啊， 啊，是这样的，因为
‘或‘ 运算这边的值已经是 1 了，这儿呢，又是一个 ‘或‘
运算，所以说，整个这边的值我们是不需要再去算的，那是不需要再去算的。
那么程序会去算吗 ？啊，
那我可以告诉你，这个地方，程序也不会去算。
啊，那么 b 呢，打印出来的结果 b = 0, 不会去赋这个值的。
啊，在这儿呢，我们就特别来说一下，强调一下，
逻辑运算符的取舍。在 C语言里头啊，其实有这样一个规定，
运算逻辑表达式求解的过程中，
并不总是执行所有的运算的。
只有在必需执行下一个逻辑运算才能求出表达式的解的时候，
才会去执行这些运算符。
否则的话，这些运算符我根本就不需要再去做求解。
我们看几个例子。啊，比方说，对于 本来是 a 与 b 与 c,
啊因为它们之间是 ‘与‘ 的关系， 所以说，如果有一个，
比方说 a 的值，如果有一个出现了
0, 那么这个表达式肯定后面就不需要再算了
也就是说只有a为非零的时候，a为真的时候
才需要再继续判别b的值，只有a和b的值都是真的
情况下，才有需要再去判别c的值，其他情况下不需要在判别了
同理，对于底下的表达式a或b或c，那么只要a是非零
也就是真啊，a已经是真了
那么就不需要再去判别b和c了，只有a为假的时候才判别b
只有a和b都判别为假的时候才回去判别c，也就是说
只有a和b都是假的情况下才回去计算
才会去运行c这个地方所给出的表达式
所以在刚才我们给出的这个例子里头，看这个表达式
因为我们已经计算出来这边的值是一，啊而且呢
这儿又是一个或运算,所以说后面的这个表达式根本就不会再被去
运算了，啊，程序根本就不会去算它了
不回去执行了，所以说根本就没有机会对
b进行赋值，虽然在这儿非零，是一，按道理
来讲应该给b赋一个1的值，但实际上不会去进行
因为整个右边的表达式程序连理都不会理它，这就是运算的结果
那么，OK，类似的呢，啊，我们再看一个小例子
看这个例子，这个例子呢可能体现的更加明显一点啊，我们第一呢
四个变量，i,a,b,c,啊，abc分别等于123
然后呢i就等于++a，或++b
或++c，啊其实这个式子大家一看其实就明白了，因为a已经是1，大家一看++a的值是
2，它已经是一个非零的值了，所以后面的++
后面这个++和这个++会被执行吗？不会被
执行，所以最后打出来的结果一定是i等于多少啊？因为，因为这已经
是2了，所以说i等于1，a呢，是2，b呢，仍然是2，c呢，仍然是3
啊这是这样一个执行结果，这是关于逻辑运算符的取舍
那么关于逻辑运算符呢我们还有一点想要说明的
就是在一个逻辑运算符的表达式里头啊
它的运算符的成员啊，可以是多种类型，它的运算对象可以是多种
什么意思呢？每一个逻辑运算符的两边，两侧不都是有两个值的吗？啊这两个值呢
其实是可以是任意类型 啊什么字符型啊，实型啊甚至指针型啊等等等等
都可以，系统呢只去看这个数是不是零
如果是零，那我就认为它是假，如果是非零
那我就认为它是真，比方说啊，这两，这个表达式里头
字符a与字符d，可以吗？当然可以，去查ascii码表，c和dascii码的值
都不是零，所以都按真来处理，所以最后这个表达式的值是真还是假？
当然是真，这就是运算符的扩展，所以说我们可以啊在
逻辑运算表达式里面写很多数据类型进去，啊，再看一个例子
OK，这有一个长长长长的表达式，啊再长都没有关系，因为我们有砍刀法
啊第一刀在哪砍啊？第一刀在这砍，啊，把这个赋值语句砍开，然后呢，我们去计算
右边的这个式子，那么第二刀在哪砍啊？
一看我们这儿有逻辑运算符，逻辑运算符的运行级是最低的，所以说第二刀在这砍
砍开以后先计算这边，那这边在哪砍啊？
一看有关系运算符，关系运算符比算术运算符要低，所以说在这砍
那么砍开以后呢，啊左边是八，右边是四减去b等于
非c，那么c，字符c本身是一个非零的数，所以说这个值应该是零
所以b等于零，然后呢整个这个表达式的值应该是
零，所以这个值是四减零，那么四减零呢等于
四，所以八大于四，返回值是一
既然它的返回值是一，中间又是一个与运算，后面还要不要算？
当然要算，那么这个运算符呢我们也要把它砍开 怎么砍呀？第一刀运算符级别最低的地方砍开，在哪儿啊？应该在这儿
判等，因为等号，我们说过
比大于号的运行级还要低，等号判完了以后呢，再去计算这个表达式的值
这个表达式应该怎么砍啊？在这儿砍开，啊因为它是关系运算符，那么关系运算符砍开之后
5不需要再算了，3加a，字符a，磨6，既然有加有模，所以说我们先算这边
啊，a模6，a的值呢，我们去查下ascii码表就知道，a的值
等于97,97模6呢得到1，所以说这边
这个小表达式算出来结果等于1，然后呢，3加1等于4,5大于4吗？大于4
所以最终这个表达式的运行的结果等于1，那么1等于字符b吗？
很显然，1不等于字符b，所以这边运行的结果是零
所以整个右边这个表达式的值等于零
那么既然中间是个与运算
那么1和0与运算在一起，它的结果是0
所以最终a的值是0
那么因为最终在这个过程里头呢啊，b进行了运算，b等于非字符c
所以说b的值也是零，所以最终这个程序打印出来的结果，是两个零，00
这个虽然画的比较乱，但我还是希望把这些笔记保留下来
以方便大家参考，啊，如果大家想参考原始的式子呢
可以去查我们上传到网站的ppt，讲到这啊，我们已经讲过了好多的运算符了
比方说赋值运算符，算术运算符，关系运算符，逻辑运算符，那这些东西有什么用呢
C，其实啊，C语言的运算符功能是非常非常强大的
那么经常啊我们在程序里头利用表达式来做一些逻辑上的判定
比方说在这我们举一个例子，这个例子啊很简单
就是要你啊判别某一年是不是闰年
啊在这呢我们给出闰年的判定条件，两个条件只要符合其中之一就是闰年
第一个条件，能被四整除，但不能被一百整除的
都是闰年，第二个条件能被一百整除
又能被四百整除的啊也是闰年
当然了，在这儿我们不考虑年数特别大的情况，有的同学可能对闰年的事情非常的了解，啊，他知道
光这么计算是不行的，啊没关系啊，我们在这我们就按这个条件来计算
那么按照这样一个条件的话我们怎样去判定闰年呢
OK，我们去看底下两个表达式就可以了
可以用如下的表达逻辑判别式来判别某一年是否 是闰年，比方说我们定义了一个变量year
啊我们已经把这个，要判定的年数呢，放在这个变量里头了
于是我们可以通过去验证这个表达式是否成立来
来判定啊这个year里头所记录的年份啊是不是闰年
我们来看一下这个表达式 其实这个表达式的含义啊，非常非常的清楚
虽然它很长，但我们按运算符的优先级别来看，这有一个或运算 所以说我们先分成两边来读，左边
左边呢，中间又有一个与运算，与运算的这边呢，这是一个表达式，这个表达式是说
如果这一年磨四，也就是说除以四它的余数是零，也就是说能被四整除，中间是一个与
也就表示并且，并且呢，年份又不能被一百整除
这就满足了第一条，或者，这个年份呢
能被四百整除，能被四百整除当然就能被一百整除了
那么对于这样一个表达式，如果它的判定结果等于零，就表示这一年
不是闰年，如果它的判定结果不等于零，等于一，那就表示这一年是闰年
同理，按照上面的逻辑我们也可以写出其他类型的表达式来，啊，我们去
自己去做习题我们就可以知道同样的判别条件
不同的人可以写出不同的表达式来，啊我们在这呢就不再去重复了，OK
关于逻辑运算符我们就讲这么多