14.运算符-关系运算符
14.1 知识点
关系运算符是什么
关系运算符用于比较两个变量或常量的关系,例如:
- 是否大于
>
- 是否小于
<
- 是否等于
==
- 是否不等于
!=
- 是否大于等于
>=
- 是否小于等于
<=
关系运算符一定存在左右两边的内容,例如 左边内容 关系运算符 右边内容
。
int a = 5;
int b = 10;
// 关系运算符不能直接这样使用
a > b;
// 运算结果会以 `bool` 类型的值返回
// 如果关系满足,返回 `true`;如果不满足,返回 `false`
bool bo = a < b;
cout << bo << endl; // 输出 1 (true)
关系运算符的运算结果可以通过赋值符号返回给左侧变量。
各种关系运算符的应用
int a = 5;
int b = 10;
// 变量与变量比较
bool result = a < b;
cout << result << endl; // 输出 1 (true)
result = a > b;
cout << result << endl; // 输出 0 (false)
result = a == b;
cout << result << endl; // 输出 0 (false)
result = a != b;
cout << result << endl; // 输出 1 (true)
result = a >= b;
cout << result << endl; // 输出 0 (false)
result = a <= b;
cout << result << endl; // 输出 1 (true)
// 变量与常量比较
result = 10 > a;
cout << result << endl; // 输出 1 (true)
result = a <= 10;
cout << result << endl; // 输出 1 (true)
result = a == 5;
cout << result << endl; // 输出 1 (true)
// 常量与常量比较
result = 5 > 3; // 1 (true)
result = 5 == 3; // 0 (false)
result = 5 != 3; // 1 (true)
// 计算结果比较
result = a + 3 > a - 2 + 3; // 8 > 6
cout << result << endl; // 输出 1 (true)
result = 3 + 3 < 5 - 1; // 6 < 4
cout << result << endl; // 输出 0 (false)
不能直接进行取值范围的比较
int a = 5;
int b = 10;
// 不准确的范围比较
bool result = 1 < a < 4;
cout << "不准确的范围比较:" << result << endl; // 输出 1 (true)
注意:不能直接这样判断一个数是否在某两个数之间。需要学习逻辑运算符后再实现范围比较。
不同类型之间的比较
不同数值类型之间可以随意进行关系运算符比较,遵循类型提升规则,即较低精度的类型会被提升为较高精度的类型。
float f = 1.2f;
double d = 5.5;
int i = 10;
short s = 5;
bool result = f > d;
cout << result << endl; // 输出 0 (false)
result = i > f;
cout << result << endl; // 输出 1 (true)
// 有符号和无符号比较
i = -1;
unsigned u = 1;
result = i < u;
cout << result << endl; // 输出 0 (false)
// 无符号数存储负数
unsigned u2 = -1;
cout << u2 << endl; // 输出 4294967295
注意:使用无符号数存储负数可能导致意外行为。
特殊类型的比较
字符串类型比较
- 比较基于字典序(Lexicographical Order)。
- 按逐字符比较 ASCII 值,当出现第一个不同字符时决定大小关系。
- 如果字符串完全相同,但长度不同,则较长字符串更大。
string str = "123";
int result = str != "1234";
cout << result << endl; // 输出 1 (true)
string str1 = "apple";
string str2 = "banana";
result = str1 < str2;
cout << result << endl; // 输出 1 (true)
result = str1 >= str2;
cout << result << endl; // 输出 0 (false)
string str3 = "apple";
string str4 = "app";
result = str3 > str4;
cout << result << endl; // 输出 1 (true)
字符类型比较
字符的比较基于 ASCII 值。
char c = 'A';
char c2 = 'B';
bool result = c != c2;
cout << result << endl; // 输出 1 (true)
result = c < c2;
cout << result << endl; // 输出 1 (true)
result = c >= 65;
cout << result << endl; // 输出 1 (true)
布尔类型比较
true
被视为1
,false
被视为0
。- 布尔值可以与其他布尔值或数值类型比较,按数值比较规则处理。
bool bo2 = true; // true -> 1
bool bo3 = false; // false -> 0
result = bo2 == bo3;
cout << result << endl; // 输出 0 (false)
result = bo2 >= bo3;
cout << result << endl; // 输出 1 (true)
result = bo2 >= 595.0f;
cout << result << endl; // 输出 0 (false)
result = bo3 < -1;
cout << result << endl; // 输出 0 (false)
14.2 知识点代码
Lesson14_运算符_关系运算符.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "关系运算符\n";
#pragma region 知识点一 关系运算符是什么
// 用于比较两个变量或常量的关系的
// 是否大于 >
// 是否小于 <
// 是否等于 ==
// 是否不等于 !=
// 是否大于等于 >=
// 是否小于等于 <=
// 关系运算符 一定存在左右两边的内容
// 左边内容 关系运算符 右边内容
int a = 5;
int b = 10;
//关系运算符 不能直接这样使用
a > b;
//因为纯比较不用这个结果 对于我们来说 没有任何的意义
//关系运算符 运算结果 会以 bool类型的值 进行返回
// 如果关系满足 则返回true ;如果不满足关系 则返回false
// 赋值符号的作用
// 先算=符号右侧的 关系表达式 计算完毕后 再返回(赋值)给我们的左侧
bool bo = a < b;
cout << bo << endl;//1 true
#pragma endregion
#pragma region 知识点二 各种关系运算符的应用
a = 5;
b = 10;
//变量和变量比较
bool result = a < b;
cout << result << endl;//1 true
result = a > b;
cout << result << endl;//0 false
result = a == b;
cout << result << endl;//0 false
result = a != b;
cout << result << endl;//1 true
result = a >= b;
cout << result << endl;//0 false
result = a <= b;
cout << result << endl;//1 true;
//变量和数值(常量)比较
result = 10 > a;
cout << result << endl;//1 true;
result = a <= 10;
cout << result << endl;//1 true;
result = a == 5;
cout << result << endl;//1 true;
//数值和数值比较
result = 5 > 3;//1 true
result = 5 == 3;//0 true
result = 5 != 3; //1 true
//计算结果比较
//关系运算符的 优先级 低于 算数运算符的
//先计算 再比较
result = a + 3 > a - 2 + 3; // 8 > 6
cout << result << endl;//1 true
result = 3 + 3 < 5 - 1;// 6 < 4
cout << result << endl;//0 false
#pragma endregion
#pragma region 知识点三 不能直接进行取值范围的比较
a = 5;
b = 10;
//判断是否在某两个值之间
//虽然这里不会报错 但是并不会达到我们想要的结果
//1 < a 先算 得到一个bool true = 1
//1 < 4 得到一个bool true 1
result = 1 < a < 4;
cout << "不准确的范围比较" << result << endl; //1 true
//注意:不能这样去判断一个数是否在两个数之间!
//学习了 逻辑运算符相关的知识点后 才能判断
#pragma endregion
#pragma region 知识点四 不同类型之间的比较
//不同数值类型之间 可以随意进行关系运算符比较
//遵循类型提升规则:即较低精度的类型会被提升为较高精度的类型进行比较
//只要是数值 就能够进行关系运算符比较 比较大于小于等于等等
float f = 1.2f;
double d = 5.5;
int i = 10;
short s = 5;
result = f > d;
cout << result << endl;//0 false
result = i > f;
cout << result << endl;//1 true
//注意:无符号和有符号进行比较时 一定要谨慎 有符号转为无符号
i = -1;
unsigned u = 1;
result = i < u;
cout << result << endl;//0 false
//由于将有符号转为无符号时,负数i会被变成一个很大的正数
//因此 在i和u比较时 会出现意想不到的问题
//尽量避免 有符号和无符号进行比较
// 使用无符号数存储负数会导致计算时的数值异常
unsigned u2 = -1;
cout << u2 << endl;//4294967295
//unsigned u2 = -1; 是将有符号的 - 1 转换为无符号整数,结果是无符号整数的最大值(对于 32 位系统,为 4294967295)。
//这是由于 C++ 的 类型转换规则 和 二进制补码表示法 导致的。
//在计算机中,整数通常使用 补码 表示:
//- 1 的补码表示是所有位都为 1。在 32 位无符号整数中,这对应于:11111111 11111111 11111111 11111111
//转换成十进制正数,就是 4294967295。
#pragma endregion
#pragma region 知识点五 特殊类型的比较
// string 类型比较规则
// 1. 比较基于字典序(Lexicographical Order)。
// 2. 按逐字符比较 ASCII 值,当出现第一个不同字符时决定大小关系。
// 3. 如果字符串完全相同,但长度不同,则较长字符串更大。
string str = "123";
int result = str != "1234";
// 比较长度不同的字符串,"123" 和 "1234" 不相等
cout << result << endl; // 1 true
string str1 = "apple";
string str2 = "banana";
result = str1 < str2;
// 比较首字符 'a' 和 'b' 的 ASCII 值,'a' < 'b'
cout << result << endl; // 1 true
result = str1 >= str2;
// 同样比较首字符,'a' 不大于或等于 'b'
cout << result << endl; // 0 false
string str3 = "apple";
string str4 = "app";
result = str3 > str4;
// 前缀相同,但 "apple" 更长,故 "apple" > "app"
cout << result << endl; // 1 true
// char 类型比较规则
// 基于 ASCII 值进行比较,'A' 的 ASCII 值是 65,'B' 的 ASCII 值是 66。
char c = 'A';
char c2 = 'B';
result = c != c2;
// 比较 'A' 和 'B',它们的 ASCII 值不同
cout << result << endl; // 1 true
result = c < c2;
// 比较 ASCII 值,65 < 66
cout << result << endl; // 1 true
result = c >= 65;
// 'A' 的 ASCII 值是 65,65 >= 65
cout << result << endl; // 1 true
// bool 类型比较规则
// 1. true 被视为 1,false 被视为 0。
// 2. bool 可以与其他 bool 或数值类型比较,按数值比较规则处理。
bool bo2 = true; // true -> 1
bool bo3 = false; // false -> 0
result = bo2 == bo3;
// 比较 1 == 0
cout << result << endl; // 0 false
result = bo2 >= bo3;
// 比较 1 >= 0
cout << result << endl; // 1 true
result = bo2 >= 595.0f;
// 比较 1 >= 595.0f,1 不大于 595.0f
cout << result << endl; // 0 false
result = bo3 < -1;
// 比较 0 < -1,0 不小于 -1
cout << result << endl; // 0 false
#pragma endregion
}
14.3 练习题
逻辑表达式结果解析
我的年龄(18) > 你们的年龄(22)
false
0
兔子的速度(3m/s) < 乌龟的速度 (0.3m/s)
false
0
狗的重量(50kg) < 兔子的重量(5kg)
false
0
我身上的Money(10元) == 你身上也有Money(10元)
true
1
求打印结果
bool b = true;
cout << (b != true); // false 0
cout << (10 == 10); // true 1
cout << (10 > 20); // false 0
cout << (10 <= 20); // true 1
cout << (10 <= 10); // true 1
求 startGame
的值
bool gameOver, startGame; // 允许不初始化
int a = 10, b = 15;
gameOver = a > (b - 5); // 10 > 10 => false 0
startGame = gameOver == (b > (a + 5)); // false == 15 > 15 => false == false => true 1
cout << "startGame = " << startGame; // 输出: startGame = 1
结果:startGame = 1
14.4 练习题代码
Lesson14_练习题.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "关系运算符 练习题\n";
#pragma region 练习题一
//请口答下列表达式的结果
//我的年龄(18) > 你们的年龄(22) false 0
//兔子的速度(3m / s) < 乌龟的速度(0.3m / s) false 0
//狗的重量(50kg) < 兔子的重量(5kg) false 0
//我身上的Money(10元) == 你身上也有Money(10元) true 1
#pragma endregion
#pragma region 练习题二
//求打印结果是什么?
//bool b = true;
//cout << (b != true) << endl; // false 0
//cout << (10 == 10) << endl; // true 1
//cout << (10 > 20) << endl; // false 0
//cout << (10 <= 20) << endl; // true 1
//cout << (10 <= 10) << endl; // true 1
#pragma endregion
#pragma region 练习题三
//请问打印结果是什么?
bool gameOver, startGame;//允许不初始化
int a = 10, b = 15;
gameOver = a > (b - 5); // 10 > 10 gameOVer = false 0
startGame = gameOver == (b > (a + 5));// false == 15 > 15 => false == false => true 1
cout << "startGame = " << startGame; // true 1
#pragma endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com