文章目录
一.关系运算符
关系运算符用于比较两个操作数的 大小 / 相等 关系,运算结果为布尔值
C 语言中用0表示假,非 0表示真;
C++中新增bool类型,直接返回true/false.
1.关系运算符
C/C++ 提供 6 种关系运算符,按优先级分为两类:
| 运算符 | 名称 | 示例 | 含义 | 优先级 |
|---|---|---|---|---|
> |
大于 | a > b | a 是否大于 b | 高 |
< |
小于 | a < b | a 是否小于 b | 高 |
>= |
大于等于 | a >= b | a 是否大于等于 b | 高 |
<= |
小于等于 | a <= b | a 是否小于等于 b | 高 |
== |
等于 | a == b | a 是否等于 b | 低 |
!= |
不等于 | a != b | a 是否不等于 b | 低 |
注意:
- 优先级:
>/</>=/<=高于==/!=; - 赋值运算符
=和 相等运算符==极易混淆,是编程高频错误点; - 关系运算符为双目运算符,左右操作数需为可比较类型(如数值型、指针型,结构体需自定义比较逻辑).
2.关系表达式
由关系运算符连接两个表达式构成的式子,称为关系表达式,结果为布尔值(0 / 非 0 或 true/false).
I.基本语法
c
表达式 1 关系运算符 表达式 2
II.示例代码
c++
#include <stdio.h>
#include <stdbool.h> // C 语言需引入此头文件使用 bool 类型(C99 及以上)
using namespace std; // C++需引入,或直接使用 std::boolalpha
int main()
{
int a = 10, b = 5, c = 10;
// C语言示例
printf("C语言:\n");
printf("a > b = %d\n", a > b); // 1(真)
printf("a < b = %d\n", a < b); // 0(假)
printf("a == c = %d\n", a == c); // 1(真)
printf("a != b = %d\n", a != b); // 1(真)
// C++示例
printf("\nC++:\n");
bool res = (a >= c);
cout << boolalpha; // 让cout输出true/false而非1/0
cout << "a >= c = " << res << endl; // true
cout << "b <= a = " << (b <= a) << endl; // true
return 0;
}
III.注意事项
-
连续关系表达式的陷阱:
不要写成
a < b < c的形式(如1 < 3 < 2), C/C++ 会按左结合性解析为(1 < 3) < 2,即 1 < 2,结果为真,但逻辑上 3 < 2 是假,正确写法应为a < b && b < c(结合逻辑运算符). -
浮点数比较:
浮点数存在精度误差,不能直接用
==比较,需判断差值是否小于极小值(如 1e-9):
c
double x = 0.1 + 0.2, y = 0.3;
if (fabs(x - y) < 1e-9) { // fabs 是浮点绝对值函数
printf("x 等于 y\n");
}
- 指针比较:
同类型指针可比较(如判断指针是否为NULL、数组元素指针的先后),不同类型指针(无强制转换)比较会报错.
二.逻辑运算符
逻辑运算符用于对布尔值进行逻辑运算(与、或、非),最终结果仍为布尔值(0 / 非 0 或 true/false).
1.逻辑运算符
C/C++ 提供 3 种逻辑运算符,优先级从高到低为:! > && > ||:
| 运算符 | 名称 | 操作数个数 | 示例 | 含义 |
|---|---|---|---|---|
! |
逻辑非 | 单目 | !a |
a 为真则结果为假,a 为假则结果为真 |
&& |
逻辑与 | 双目 | a && b |
a 和 b 都为真时结果为真,否则为假 |
| ` | ` | 逻辑或 | 双目 |
2.逻辑表达式
由逻辑运算符连接布尔值 / 关系表达式构成的式子,称为逻辑表达式,核心特性是短路求值.
I.核心特性:短路求值
逻辑运算符会按 "最小计算原则" 执行,避免不必要的运算,这是优化性能的关键:
- 逻辑与(
&&): 若左侧表达式为假,直接返回假,不执行右侧表达式; - 逻辑或(
||): 若左侧表达式为真,直接返回真,不执行右侧表达式.
II.示例代码
c
#include <stdio.h>
using namespace std;
int main()
{
int a = 0, b = 1, c = 2;
// 1. 逻辑非
printf("!b = %d\n", !b); // 0(b=1为真,!b为假)
printf("!a = %d\n", !a); // 1(a=0为假,!a为真)
// 2. 逻辑与(短路求值)
if (a > 0 && ++c > 0)
{ // a>0为假,++c不执行
printf("逻辑与为真\n");
}
printf("c = %d\n", c); // c仍为2(未执行++c)
// 3. 逻辑或(短路求值)
if (b > 0 || ++c > 0)
{ // b>0为真,++c不执行
printf("逻辑或为真\n");
}
printf("c = %d\n", c); // c仍为2(未执行++c)
// 4. 组合使用(优先级:! > && > ||)
bool res = !a && (b > 0 || c < 0);
cout << boolalpha << "res = " << res << endl; // true
return 0;
}
III.注意事项
-
非布尔值的逻辑运算:
C/C++ 中,逻辑运算符的操作数可以是任意数值 ------
0 视为假,非 0 视为真.例如:cint x = 5, y = 0; printf("x && y = %d\n", x && y); // 0(5 为真,0 为假,与运算为假) printf("x || y = %d\n", x || y); // 1(5 为真,或运算为真) -
短路求值的坑与用:
坑:若右侧表达式有副作用(如++、--、函数调用),短路会导致副作用不执行,需谨慎:cint i = 0; if (false && ++i) {} // i 仍为 0,++i 未执行用:可简化代码,例如判空 + 取值:cchar* str = "hello"; if (str && *str == 'h') { // 先判 str 非空,再取第一个字符,避免空指针访问 printf("str 以 h 开头\n"); } -
逻辑运算符与位运算符的区别:
不要混淆
&&(逻辑与)和&(按位与)、||(逻辑或)和|(按位或):- 逻辑运算符操作
布尔值,结果为布尔值; - 位运算符操作
二进制位,结果为数值; - 示例:
3 && 5结果为 1(真),3 & 5结果为 1(二进制011 & 101 = 001).
- 逻辑运算符操作
总结
- 关系运算符用于比较,结果为布尔值,注意浮点数比较和连续比较的陷阱;
- 逻辑运算符用于布尔值运算,核心是短路求值,优先级
!>&&>||; C语言用0/非 0表示布尔值,C++新增bool类型(true/false);- 避免混淆
=与==、&&与&、||与|.