这两个是 C 语言中的逻辑运算符,它们用于连接两个或多个关系表达式或逻辑表达式,并根据表达式的真假值(在 C 语言中,0 代表假,非 0 代表真)来返回一个结果。

(图片来源网络,侵删)
&& (逻辑与 - AND)
&& 是逻辑与运算符,它连接两个表达式,只有当两个表达式都为真时,整个表达式的结果才为真,否则,结果为假。
可以把它理解为中文里的“并且”。
真值表
| 表达式 A | 表达式 B | A && B 的结果 |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 假 |
| 假 | 假 | 假 |
示例代码
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int c = 5;
// 示例 1: 两个条件都为真
if (a > 5 && b > 15) {
printf("条件 1 成立: a 大于 5 b 大于 15\n"); // 这行会被打印
}
// 示例 2: 第一个条件为真,第二个为假
if (a > 5 && c > 15) {
printf("条件 2 成立: a 大于 5 c 大于 15\n"); // 这行不会被打印
}
// 示例 3: 第一个条件为假,C语言有一个特性叫做“短路求值”
if (a < 5 && b > 15) {
printf("条件 3 成立: a 小于 5 b 大于 15\n"); // 这行不会被打印
}
return 0;
}
重要特性:短路求值
&& 运算符具有短路求值的特性,这意味着:
&&左边的表达式为假,那么整个表达式的结果必然为假,右边的表达式将不会被计算。- 只有当左边的表达式为真时,才会去计算右边的表达式。
这个特性在编程中非常有用,可以用来避免不必要的计算,甚至避免程序出错。

(图片来源网络,侵删)
经典例子:
int *ptr = NULL; // ptr 是一个空指针
// 错误的写法:ptr 为 NULL,ptr->value 就会导致程序崩溃
// if (ptr != NULL && ptr->value == 10) { ... }
// 正确且安全的写法(利用短路求值):
// ptr 为 NULL (假),&& 后面的表达式 ptr->value == 10 就不会被执行
if (ptr != NULL && ptr->value == 10) {
// ...
}
(逻辑或 - OR)
是逻辑或运算符,它连接两个表达式,只要其中任意一个表达式为真,整个表达式的结果就为真,只有当两个表达式都为假时,结果才为假。
可以把它理解为中文里的“或者”。
真值表
| 表达式 A | 表达式 B | A || B 的结果 | | :------: | :------: | :-------------: | | 真 | 真 | 真 | | 真 | 假 | 真 | | 假 | 真 | 真 | | 假 | 假 | 假 |

(图片来源网络,侵删)
示例代码
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int c = 5;
// 示例 1: 第一个条件为真,第二个为假
if (a > 5 || c > 15) {
printf("条件 1 成立: a 大于 5 或者 c 大于 15\n"); // 这行会被打印
}
// 示例 2: 两个条件都为真
if (a > 5 || b > 15) {
printf("条件 2 成立: a 大于 5 或者 b 大于 15\n"); // 这行会被打印
}
// 示例 3: 两个条件都为假
if (a < 5 || c < 1) {
printf("条件 3 成立: a 小于 5 或者 c 小于 1\n"); // 这行不会被打印
}
return 0;
}
重要特性:短路求值
运算符同样具有短路求值的特性,这意味着:
- 左边的表达式为真,那么整个表达式的结果必然为真,右边的表达式将不会被计算。
- 只有当左边的表达式为假时,才会去计算右边的表达式。
经典例子:
int x = 0;
int y = 5;
// x 不为 0,y++ 就不会执行
if (x != 0 || y++ > 5) {
// ...
}
printf("x 的值是: %d\n", x); // 输出 0
printf("y 的值是: %d\n", y); // 输出 5,而不是 6,因为 y++ 没有被执行
总结与对比
| 运算符 | 名称 | 含义 | 真值条件 | 短路求值特性 |
|---|---|---|---|---|
&& |
逻辑与 | 并且 | 两个表达式都为真 | 左边为假时,右边不计算 |
| 逻辑或 | 或者 | 至少一个表达式为真 | 左边为真时,右边不计算 | |
| 逻辑非 | 不是 | 将表达式的真假值取反 | 无 |
核心要点:
- 操作数是真假值:
&&和 操作的是表达式的“真”或“假”,而不是具体的数值。if (5)这样的写法是允许的,因为5是非零值,所以为真。 - 短路求值是关键:理解短路求值对于写出高效、健壮的代码至关重要,它不仅能优化性能,还能防止像“除以零”或“空指针解引用”这类严重错误。
- 与位运算符的区别:不要将
&&/ 与位运算符&/ 混淆。&&和 是针对整个表达式的逻辑真假进行运算,并产生1(真) 或0(假) 的结果。&和 是针对操作数的二进制位进行运算。1 && 2的结果是1(逻辑真),而1 & 2的结果是0(二进制01 & 10)。
