【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. 简化代码:可以写出更简洁的条件判断

记住关键点:

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

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

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

相关推荐
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
Luminous.14 天前
C语言--day30
c语言·开发语言
玖玥拾14 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽14 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩14 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
2601_9516438814 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
m0_5474866615 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
✎ ﹏梦醒͜ღ҉繁华落℘15 天前
编程基础 --高内聚,低耦合
c语言·单片机
QK_0015 天前
C语言 static 关键字三大作用
c语言·开发语言
隔窗听雨眠15 天前
C语言函数递归从入门到精通(下):性能优化与工程实践
c语言·算法·性能优化