跳至正文
View Categories

1 min read

主要内容 #

1. 关系表达式 #

小结一下之前的大师码课程中,学习的 关系运算符 和 关系表达式。

5 >  6;   // 大于
5 >= 6;   // 大于等于
5 <  6;   // 小于
5 <= 6;   // 小于等于
5 == 6;   // 等于
5 != 6;   // 不等于

2. 逻辑表达式 #

小结一下之前的大师码课程中,学习的 逻辑运算符 和 逻辑表达式。

true && true;   // 与
true || true;   // 或
!true;          // 非

关系运算 和 逻辑运算 是有着内在联系的。
它们可以共同出现。比如:

(5 > 0) && (5 > 2);   // 与
(5 > 0) || (5 > 2);   // 或
!(5 > 0);             // 非

关于它们之间的关系,请区分清楚。

3. “关系运算符”和“逻辑运算符”的“运算优先级” #

在介绍分解法之前,我们需要先简单了解一下“运算优先级”。

在数学中,我们学习过四则运算,还记得加减乘除的“运算优先级”吗?

+ -    运算优先级相等;
* / %  运算优先级相等;              // C++ 的取余运算,是数学中还没有学习到的。特此补充说明

+ -    运算优先级小于(<)  * / %    //也就是,先计算 * / %

在“关系运算符”和“逻辑运算符”中,其实也有“运算优先级”。
它们的“运算优先级”,从高到底排列如下:

高 -    !    
中 -    && ||             运算优先级相等;
低 -    < <= == != > >=   运算优先级相等;

4. 取反 逻辑表达式 #

上节课的学习中,我们学习了逻辑运算“非”
请看下面的表达式,并在数轴上画出 a 的范围。

-2 < a && a < 2

请看下面的表达式,并在数轴上画出 a 的范围。

!(-2 < a && a < 2)

4.1 图解法 #

答案:

  • -2 < a && a < 2

  • !(-2 < a && a < 2)

小练习:
请将 !(-2 < a && a < 2) 对应的答案图,改写成“或”关系的表达式。

答案:

!(-2 < a && a < 2)  <== 等价于 ==>  (-2 >= a || a >= 2)

// 写成这个样子更容易理解一些
!(-2 < a && a < 2)  <== 等价于 ==>  (a <= -2 || 2 <= a)

理解这样的改写,对 C++ 的学习非常重要。针对这一的问题,主要有两种思路。

  • 1. 图解法 – 如上面的说明
  • 2. 分解法

4.2. 分解法 #

在解题前,我们先来思考以下的几种情形。
请回答:

!(true  && true )  <== 等价于 ==>  ?
!(true  && false)  <== 等价于 ==>  ?
!(false && true )  <== 等价于 ==>  ?
!(false && false)  <== 等价于 ==>  ?

!(true  || true )  <== 等价于 ==>  ?
!(true  || false)  <== 等价于 ==>  ?
!(false || true )  <== 等价于 ==>  ?
!(false || false)  <== 等价于 ==>  ?

答案:

!(true  && true )  <== 等价于 ==>  (false || false)
!(true  && false)  <== 等价于 ==>  (false || true )
!(false && true )  <== 等价于 ==>  (true  || false)
!(false && false)  <== 等价于 ==>  (true  || true )

!(true  || true )  <== 等价于 ==>  (false && false)
!(true  || false)  <== 等价于 ==>  (false && true )
!(false || true )  <== 等价于 ==>  (true  && false)
!(false || false)  <== 等价于 ==>  (true  && true )

基于上面的分析,我们可以得到这样的规律:

  • 1. && 和 || 互换;
  • 2. true 和 false 互换;

那接下来我们来看一下,怎么解决上述的问题。

!(-2 < a && a < 2) 
        ||
        \/

!((-2 < a) && (a < 2))      // 根据计算的优先级,加括号。
        ||
        \/

!((******) && (#####))      // 将第二层的括号内容,看成整体。
        ||
        \/

!(-2 < a ) || !(a < 2)      // 先分解最外层括号。
        ||
        \/

-2 >= a || a >= 2           // 继续分解当下的最外层括号。

如果遇到多层的逻辑关系嵌套,也像这样,由外向内,逐层分解即可。

小练习:

!(a <=7 || 20 < a )       <== 等价于 ==>  
!(15 < a && a < 59)       <== 等价于 ==>  
!(a>5) && a < 10          <== 等价于 ==>  
!(true && false && true)  <== 等价于 ==> 
!(true || false || true)  <== 等价于 ==>

答案:

!(a <=7 || 20 < a )       <== 等价于 ==>  7 < a && a <= 20
!(15 < a && a < 59)       <== 等价于 ==>  a <= 15 || 59 =< a
!(a>5) && a < 10          <== 等价于 ==>  5 <= a && a < 10
!(true && false && true)  <== 等价于 ==>  (false || true || false)
!(true || false || true)  <== 等价于 ==>  (false && true && false)

习题 #

课后练习