【C】使用C语言举例说明逻辑运算符的短路特性

1. 逻辑与 (&&) 的短路特性

&& 的第一个操作数为 假(0) 时,整个表达式结果已确定为假,第二个操作数不会被执行

objectivec 复制代码
#include <stdio.h>

int func1() {
    printf("func1 被调用了\n");
    return 0;  // 返回假
}

int func2() {
    printf("func2 被调用了\n");
    return 1;  // 返回真
}

int main() {
    // 由于 func1() 返回 0(假),func2() 不会被调用
    if (func1() && func2()) {
        printf("条件为真\n");
    } else {
        printf("条件为假\n");
    }
    
    return 0;
}

func1 被调用了

条件为假

注意:func2() 没有被调用!

2. 逻辑或 (||) 的短路特性

|| 的第一个操作数为 真(非0) 时,整个表达式结果已确定为真,第二个操作数不会被执行

objectivec 复制代码
#include <stdio.h>

int func1() {
    printf("func1 被调用了\n");
    return 1;  // 返回真
}

int func2() {
    printf("func2 被调用了\n");
    return 1;  // 返回真
}

int main() {
    // 由于 func1() 返回 1(真),func2() 不会被调用
    if (func1() || func2()) {
        printf("条件为真\n");
    } else {
        printf("条件为假\n");
    }
    
    return 0;
}

func1 被调用了

条件为真

3. 实际应用场景

场景1:避免空指针解引用

如果指针为空,就不会执行解引用报段错误啦(~ ̄▽ ̄)~

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = NULL;
    
    // 安全的检查方式:如果ptr为NULL,不会执行 *ptr > 0
    if (ptr != NULL && *ptr > 0) {
        printf("指针有效且值大于0\n");
    } else {
        printf("指针无效或值不大于0\n");
    }
    
    return 0;
}

场景2:数组边界检查

objectivec 复制代码
#include <stdio.h>

#define ARRAY_SIZE 5

int array[ARRAY_SIZE] = {1, 2, 3, 4, 5};

int get_element(int index) {
    // 先检查索引是否有效,再访问数组
    if (index >= 0 && index < ARRAY_SIZE) {
        return array[index];
    }
    return -1;
}

int main() {
    printf("获取元素:%d\n", get_element(2));  // 正常
    printf("获取元素:%d\n", get_element(10)); // 越界,但安全
    return 0;
}

场景3:函数调用优化

objectivec 复制代码
#include <stdio.h>

int is_positive(int x) {
    return x > 0;
}

int is_even(int x) {
    printf("检查是否为偶数\n");
    return x % 2 == 0;
}

int main() {
    int num = -5;
    
    // 如果数字不是正数,就不需要检查是否为偶数
    if (is_positive(num) && is_even(num)) {
        printf("%d 是正偶数\n", num);
    } else {
        printf("%d 不是正偶数\n", num);
    }
    
    return 0;
}

总结

短路特性的价值:

  1. 提高效率:避免不必要的计算

  2. 增强安全性:防止空指针、数组越界等问题

  3. 简化代码:可以写出更简洁的条件判断

记住关键点:

  • &&:第一个为假就短路

  • ||:第一个为真就短路

  • 短路时,第二个操作数完全不会执行

相关推荐
zhixingheyi_tian5 小时前
hdfs.c 之解析
c语言·hadoop·hdfs
橘子编程5 小时前
编程语言全指南:从C到Rust
java·c语言·开发语言·c++·python·rust·c#
独小乐5 小时前
007.GNU C内联汇编杂谈|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·汇编·单片机·嵌入式硬件·arm·gnu
笨笨饿5 小时前
42_C语言查找算法
linux·服务器·c语言·人工智能·mcu·学习方法·嵌入式软件
计算机安禾5 小时前
【数据结构与算法】第33篇:交换排序(二):快速排序
c语言·开发语言·数据结构·数据库·算法·矩阵·排序算法
算法鑫探5 小时前
2025 图形(蓝桥杯十六届C组程序题 C 题)
c语言·数据结构·算法·新人首发
JasmineX-15 小时前
数据结构(笔记)——单向循环链表
c语言·数据结构·笔记·链表
bnmoel6 小时前
C语言自定义类型:联合和枚举
c语言·开发语言·数据结构·算法
计算机安禾6 小时前
【数据结构与算法】第34篇:选择排序:简单选择排序与堆排序
c语言·开发语言·数据结构·c++·算法·排序算法·visual studio
升职佳兴16 小时前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言