2.5.5 逻辑运算符和逻辑表达式
在程序中不仅需要比较两个量的大小关系,而且有时会遇到更复杂的问题,这些问题涉及多个条件,可能需要根据这些具有关联关系的多个条件来决定程序下一步的工作,这就会涉及到逻辑运算符。
1. 逻辑运算符
逻辑运算符是用来表示两个操作数的逻辑关系的,C++有3个逻辑运算符,如表2-12所示。
表2-12 逻辑运算符
|
运算符
|
名 称
|
运算量个数
|
说 明
|
结 合 性
|
|
!
|
逻辑非
|
单目运算符
|
对单个表达式取反,
即由真变假或由假变真
|
右结合
|
|
&&
|
逻辑与
|
双目运算符
|
两个表达式都为真时,
表达式的值为真
|
左结合
|
|
||
|
逻辑或
|
双目运算符
|
两个表达式有一个为
真时,表达式的值为真
|
左结合
|
1) 逻辑运算的值
逻辑运算的值也为真和假两种,分别用1和0来表示。
2) 逻辑运算求值规则
(1) 与运算&&:参与运算的两个量都为真时,结果才为真,否则为假。如下所示:
- 5>0&&4>2
由于5>0为真,4>2也为真,相与的结果也为真。
(2) 或运算||:参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。如下所示:
- 5>0||5>8
由于5>0为真,相或的结果也就为真。
(3) 非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。如下所示:
- !(5>0)的结果为假。
3) 逻辑运算符优先级
逻辑运算符和其他运算符优先级的关系由高到低可表示如下:
(1) !->&&->||
(2) 关系运算符!->算术运算符->关系运算符&&和||->赋值运算符
按照运算符的优先顺序可以得出:
- a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
2. 逻辑表达式
用逻辑运算符将表达式组建起来构成的有意义的式子。其中的表达式可以是逻辑表达式、算术表达式、关系表达式、赋值表达式等。
1) 逻辑表达式格式
- 表达式 逻辑运算符 表达式
其中的表达式又可以是逻辑表达式,从而组成了嵌套的情形。如下所示:
- (a||b)&&c
2) 逻辑表达式的值
逻辑表达式的值是式中各种逻辑运算的最后值,以1和0分别代表真和假。例如,!a&&b||c就是一个逻辑表达式。
在逻辑表达式的计算过程中,并不是所有的逻辑运算符都要执行,只有在必须执行下一个逻辑运算符才能求出该表达式的解时,才执行该运算符。如下所示:
(1) a&&b&&c,只有当a为真(即为非0值)时,才需要判别b的值;只有a和b都为真时才需要判别c的值;只要a为假,就不必判别b和c(此时整个表达式已确定为假)的值;若a为真,b为假,则不判别c的值。
(2) a||b||c,如果a为真(非0),就不必判别b和c;若a为假,才判别b;若a和b都为假,才判别c。
熟练掌握C++的关系运算符和逻辑运算符后,就可以巧妙地用一个逻辑表达式来表示较为复杂的条件。
例如,判别某年year是否是闰年。闰年的条件是符合下面条件二者之一:
(1) 能被4整除,但不能被100整除;
(2) 能被4整除,又能被400整除。
可用下面的逻辑表达式来表示:
- (year%4==0&&year%100!=0)||(year%4==0&&year%400=0)
当year取某一整数值时,若上述表达式的值为1(真),则year为闰年,否则不是闰年。