关系表达式
-
在C++中,关系运算符用于判断表达式之间的大小关系,对两边的值进行6种情况的判断:
- 大于
>
和大于等于>=
运算符 - 小于
<
和小于等于<=
运算符 - 相等
==
和不相等!=
运算符
- 大于
-
关系运算符中,表达式结果的类型可以是字符或者数字,但不可以是字符串
-
关系表达式返回一个布尔值:成立为1(true)代表真,不成立为0(false)代表假
-
浮点数一般不会用 == 或者 != 来判断,因为可能产生表示误差。
- 比较两个浮点数是否相等,需要看两个数的差值是否小于一定的精度,比如:对于浮点数a和b,如果(a - b) < 1e-6 如果值为真,就判断两个浮点数相等。
逻辑表达式
关系表达式可以判断某个条件是否成立,逻辑表达式中包含了多个关系表达式,可以对多个条件进行判断
- C++使用逻辑运算符连接多个关系表达式,从而构建逻辑表达式。
- 常用的逻辑运算符有以下三种:
- 逻辑AND运算符
&&
:判断两个关系表达式是否同时成立 - 逻辑OR运算符
||
:判断两个关系表达式是否至少有一个成立 - 逻辑NOT运算符
!
:判断某个关系表达式是否不成立
- 逻辑AND运算符
假设p1和p2是关系表达式的返回结果,逻辑运算符的运算规则可以参考下表:
运算符优先级
至此,我们已经学习的运算符如下:
- 算术运算符(
+
-
*
/
%
++
--
等) - 赋值运算符(
=
等) - 位运算符(
<<
>>
等) - 关系运算符(
>
>=
<
<=
==
!=
等) - 逻辑运算符(
&&
||
!
等)
运算符优先顺序:赋值运算符< 逻辑与运算符< 关系运算符< 算术运算符。
对于这些常用的运算符,按照计算优先级从高到低(左边更高,右边更低)进行排列,可以得到如下表格:
Tips:对于一个表达式,虽然可以通过计算优先级省略掉括号,但为了代码的可读性,我们在编写时一般都选择把括号加上。
练习1:输入年份,判断是否为闰年
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
int year;
cin >> year;
bool is_leap_year;
// TODO 请用一个表达式来判断 year 是否为闰年
// 是400的倍数;或者是4的倍数并且不是100的倍数
is_leap_year = (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0));
// 也可以这么写:
// is_leap_year = !(year % 400) || (!(year % 4) && (year % 100));
cout << is_leap_year << endl;
return 0;
}
练习2:下列运算输出结果为:
int a, b, c;
a = b = c = 1;
cout << a-- || --b && ++c;
输出:1
表达式cout << a-- || --b && ++c
;中,a--
先计算逻辑表达式,再改变变量a的数值;--b
与++c
先改变变量b与c的数值,再计算逻辑表达式:
- 根据运算优先级,先执行
&&
运算:--b && ++c
即为0 && 2
,得到0; - 再进行
||
运算:a-- || 0
即为1 || 0
,得到1,故输出表达式值为1。 - (变量a逻辑运算结束后,值改变为0。)