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

记住关键点:

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

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

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

相关推荐
阿金要当大魔王~~4 小时前
uniapp 页面标签 传值 ————— uniapp 定义 接口
前端·javascript·uni-app·1024程序员节
数据库知识分享者小北4 小时前
如何构建企业级数据分析助手:Data Agent 开发实践
数据库·阿里云·1024程序员节·dataagent
小羊学伽瓦4 小时前
【Java数据结构】——常见力扣题综合
java·数据结构·leetcode·1024程序员节
GreatSQL社区4 小时前
GreatSQL 配置 SSL 访问:单机与 MGR 集群指南
1024程序员节
虎冯河4 小时前
图像,视频Lora模型训练的Timestep Type时间步类型
aigc·comfyui·模型训练·1024程序员节
helloworddm4 小时前
Orleans Grain Directory 系统综合分析文档
c#·1024程序员节
摸鱼的老谭4 小时前
Java学习之旅第三季-17:Lambda表达式
java·lambda表达式·1024程序员节
冰山上的柯莱4 小时前
需求上线部署流程
1024程序员节·上线流程
文火冰糖的硅基工坊4 小时前
[人工智能-大模型-66]:模型层技术 - 两种编程范式:数学函数式编程与逻辑推理式编程,构建起截然不同的智能系统。
人工智能·神经网络·算法·1024程序员节