and与or在C语言中如何运算?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

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

and or 的c语言意思
(图片来源网络,侵删)

&& (逻辑与 - 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;
}

重要特性:短路求值

&& 运算符具有短路求值的特性,这意味着:

  • && 左边的表达式为,那么整个表达式的结果必然为假,右边的表达式将不会被计算
  • 只有当左边的表达式为时,才会去计算右边的表达式。

这个特性在编程中非常有用,可以用来避免不必要的计算,甚至避免程序出错。

and or 的c语言意思
(图片来源网络,侵删)

经典例子:

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 的结果 | | :------: | :------: | :-------------: | | 真 | 真 | 真 | | 真 | 假 | 真 | | 假 | 真 | 真 | | 假 | 假 | 假 |

and or 的c语言意思
(图片来源网络,侵删)

示例代码

#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++ 没有被执行

总结与对比

运算符 名称 含义 真值条件 短路求值特性
&& 逻辑与 并且 两个表达式都为真 左边为假时,右边不计算
逻辑或 或者 至少一个表达式为真 左边为真时,右边不计算
逻辑非 不是 将表达式的真假值取反

核心要点:

  1. 操作数是真假值&& 和 操作的是表达式的“真”或“假”,而不是具体的数值。if (5) 这样的写法是允许的,因为 5 是非零值,所以为真。
  2. 短路求值是关键:理解短路求值对于写出高效、健壮的代码至关重要,它不仅能优化性能,还能防止像“除以零”或“空指针解引用”这类严重错误。
  3. 与位运算符的区别:不要将 &&/ 与位运算符 &/ 混淆。
    • && 和 是针对整个表达式的逻辑真假进行运算,并产生 1 (真) 或 0 (假) 的结果。
    • & 和 是针对操作数的二进制位进行运算。
    • 1 && 2 的结果是 1 (逻辑真),而 1 & 2 的结果是 0 (二进制 01 & 10)。
-- 展开阅读全文 --
头像
dede表单如何添加验证码?
« 上一篇 03-04
Linux下C语言编程工具有哪些?
下一篇 » 03-04
取消
微信二维码
支付宝二维码

目录[+]