C++关系运算符 #
一、关系运算符概述 #
关系运算符用于比较两个值,返回布尔值(true或false)。
1.1 运算符列表 #
| 运算符 | 名称 | 示例 | 含义 |
|---|---|---|---|
== |
等于 | a == b |
a等于b |
!= |
不等于 | a != b |
a不等于b |
> |
大于 | a > b |
a大于b |
< |
小于 | a < b |
a小于b |
>= |
大于等于 | a >= b |
a大于等于b |
<= |
小于等于 | a <= b |
a小于等于b |
1.2 基本使用 #
cpp
#include <iostream>
int main() {
int a = 10, b = 20;
std::cout << std::boolalpha; // 输出true/false而非1/0
std::cout << "a == b: " << (a == b) << std::endl; // false
std::cout << "a != b: " << (a != b) << std::endl; // true
std::cout << "a > b: " << (a > b) << std::endl; // false
std::cout << "a < b: " << (a < b) << std::endl; // true
std::cout << "a >= b: " << (a >= b) << std::endl; // false
std::cout << "a <= b: " << (a <= b) << std::endl; // true
return 0;
}
二、等于运算符 == #
2.1 基本用法 #
cpp
int a = 10;
int b = 10;
int c = 20;
bool r1 = (a == b); // true
bool r2 = (a == c); // false
2.2 常见错误:= vs == #
cpp
int x = 5;
// 错误:使用赋值运算符=
if (x = 10) { // x被赋值为10,条件为true
// ...
}
// 正确:使用比较运算符==
if (x == 10) {
// ...
}
// 防止错误的写法(Yoda条件)
if (10 == x) { // 如果写成10 = x会编译错误
// ...
}
2.3 浮点数比较 #
cpp
// 不推荐:直接比较浮点数
double a = 0.1 + 0.2;
double b = 0.3;
bool equal = (a == b); // 可能为false!
// 推荐:使用误差范围
#include <cmath>
bool isEqual(double x, double y, double epsilon = 1e-9) {
return std::abs(x - y) < epsilon;
}
bool equal = isEqual(a, b); // true
2.4 字符串比较 #
cpp
#include <string>
// C风格字符串(char*)
const char* s1 = "hello";
const char* s2 = "hello";
bool r1 = (s1 == s2); // 比较指针地址,不是内容!
// 使用strcmp
#include <cstring>
bool r2 = (strcmp(s1, s2) == 0); // 比较内容
// C++ string
std::string str1 = "hello";
std::string str2 = "hello";
bool r3 = (str1 == str2); // 比较内容,true
三、不等于运算符 != #
3.1 基本用法 #
cpp
int a = 10;
int b = 20;
bool notEqual = (a != b); // true
3.2 常见应用 #
cpp
// 检查值是否改变
int oldValue = 10;
int newValue = 20;
if (newValue != oldValue) {
std::cout << "值已改变" << std::endl;
}
// 检查指针非空
int* ptr = nullptr;
if (ptr != nullptr) {
std::cout << *ptr << std::endl;
}
四、大于和小于运算符 #
4.1 基本用法 #
cpp
int a = 10, b = 20;
bool greater = (a > b); // false
bool less = (a < b); // true
bool greaterEqual = (a >= b); // false
bool lessEqual = (a <= b); // true
4.2 链式比较(注意) #
cpp
int x = 5;
// 数学写法:1 < x < 10
// C++中不推荐这样写
bool result = (1 < x < 10); // 实际是 (1 < x) < 10
// 1 < x 为 true(即1)
// 1 < 10 为 true
// 所以结果为 true
// 正确写法
bool result = (x > 1 && x < 10); // true
4.3 字符比较 #
cpp
char c1 = 'A'; // ASCII: 65
char c2 = 'a'; // ASCII: 97
bool r1 = (c1 < c2); // true
bool r2 = (c1 > c2); // false
// 比较字符大小
if (c1 >= 'A' && c1 <= 'Z') {
std::cout << "大写字母" << std::endl;
}
五、返回值与布尔转换 #
5.1 返回布尔值 #
cpp
// 关系运算符返回bool类型
bool result = (5 > 3); // true
// 可以直接用于条件
if (5 > 3) {
std::cout << "5大于3" << std::endl;
}
5.2 布尔值输出 #
cpp
#include <iostream>
int main() {
bool result = (5 > 3);
// 默认输出1/0
std::cout << result << std::endl; // 1
// 使用boolalpha输出true/false
std::cout << std::boolalpha;
std::cout << result << std::endl; // true
// 恢复默认
std::cout << std::noboolalpha;
std::cout << result << std::endl; // 1
return 0;
}
六、运算符优先级 #
6.1 与算术运算符的关系 #
cpp
// 关系运算符优先级低于算术运算符
int a = 5, b = 3, c = 2;
bool r1 = a + b > c; // 等价于 (a + b) > c,即 8 > 2,true
bool r2 = a > b + c; // 等价于 a > (b + c),即 5 > 5,false
bool r3 = a + b > b + c; // 等价于 (a + b) > (b + c),即 8 > 5,true
6.2 关系运算符之间的优先级 #
cpp
// < > <= >= 优先级高于 == !=
int a = 5, b = 3, c = 5;
bool r1 = a > b == c; // 等价于 (a > b) == c,即 true == 5
// true转换为1,1 == 5为false
bool r2 = a == b < c; // 等价于 a == (b < c),即 5 == false
// false转换为0,5 == 0为false
6.3 优先级表 #
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 高 | 算术运算符 | 左到右 |
< > <= >= |
左到右 | |
| 低 | == != |
左到右 |
6.4 使用括号 #
cpp
// 不清晰
bool r = a > b == c;
// 清晰
bool r = (a > b) == c;
七、比较不同类型 #
7.1 整数与浮点数 #
cpp
int i = 10;
double d = 10.0;
bool r1 = (i == d); // true(整数提升为浮点数)
// 注意精度问题
int a = 1;
double b = 0.1;
bool r2 = (a == b * 10); // 可能为false!
7.2 有符号与无符号 #
cpp
int s = -1;
unsigned int u = 1;
// 危险:有符号数会转换为无符号数
bool r = (s < u); // false!-1转换为很大的无符号数
// 安全做法
bool r = (s < 0 || static_cast<unsigned int>(s) < u);
7.3 不同大小的整数 #
cpp
short s = 100;
int i = 100;
long l = 100L;
bool r1 = (s == i); // true
bool r2 = (i == l); // true
八、实际应用 #
8.1 条件判断 #
cpp
int score = 85;
if (score >= 90) {
std::cout << "优秀" << std::endl;
} else if (score >= 80) {
std::cout << "良好" << std::endl;
} else if (score >= 60) {
std::cout << "及格" << std::endl;
} else {
std::cout << "不及格" << std::endl;
}
8.2 循环条件 #
cpp
// while循环
int i = 0;
while (i < 10) {
std::cout << i << std::endl;
i++;
}
// for循环
for (int i = 0; i < 10; i++) {
std::cout << i << std::endl;
}
8.3 范围检查 #
cpp
int age = 25;
// 检查是否在范围内
if (age >= 0 && age <= 120) {
std::cout << "有效年龄" << std::endl;
}
// 检查是否在范围外
if (age < 0 || age > 120) {
std::cout << "无效年龄" << std::endl;
}
8.4 查找最大最小值 #
cpp
int a = 10, b = 20, c = 15;
int maxVal = a;
if (b > maxVal) maxVal = b;
if (c > maxVal) maxVal = c;
int minVal = a;
if (b < minVal) minVal = b;
if (c < minVal) minVal = c;
// 使用std::max和std::min
#include <algorithm>
int maxVal = std::max({a, b, c});
int minVal = std::min({a, b, c});
九、三向比较运算符(C++20) #
9.1 太空船运算符 <=> #
cpp
#include <compare>
int a = 10, b = 20;
auto result = a <=> b; // std::strong_ordering::less
if (result < 0) {
std::cout << "a < b" << std::endl;
} else if (result > 0) {
std::cout << "a > b" << std::endl;
} else {
std::cout << "a == b" << std::endl;
}
9.2 返回类型 #
cpp
// std::strong_ordering:强排序(完全可替代)
// std::weak_ordering:弱排序(等价但不相同)
// std::partial_ordering:部分排序(如浮点数有NaN)
double x = 3.14, y = 2.71;
auto result = x <=> y; // std::partial_ordering
十、最佳实践 #
10.1 使用括号明确意图 #
cpp
// 不推荐
if (a + b > c && d < e)
// 推荐
if ((a + b) > c && (d < e))
10.2 避免直接比较浮点数 #
cpp
// 不推荐
if (x == 0.3)
// 推荐
if (std::abs(x - 0.3) < epsilon)
10.3 注意有符号与无符号比较 #
cpp
// 危险
for (int i = 0; i < vec.size(); i++) // vec.size()返回size_t
// 安全
for (size_t i = 0; i < vec.size(); i++)
// 或
for (int i = 0; i < static_cast<int>(vec.size()); i++)
10.4 使用constexpr比较 #
cpp
constexpr bool isInRange(int value, int min, int max) {
return value >= min && value <= max;
}
static_assert(isInRange(5, 0, 10), "Value out of range");
十一、总结 #
关系运算符一览 #
| 运算符 | 说明 | 返回值 |
|---|---|---|
== |
等于 | bool |
!= |
不等于 | bool |
> |
大于 | bool |
< |
小于 | bool |
>= |
大于等于 | bool |
<= |
小于等于 | bool |
注意事项 #
- 区分
=和== - 浮点数比较使用误差范围
- 注意有符号与无符号比较
- 使用括号明确优先级
- 避免链式比较
下一步,让我们学习逻辑运算符!
最后更新:2026-03-26