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

记住关键点:

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

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

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

相关推荐
无相求码1 分钟前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
C++ 老炮儿的技术栈1 小时前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
炸膛坦客10 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
程序员Rock17 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
blevoice1 天前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
小小晓.1 天前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
深念Y1 天前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言
十月的皮皮1 天前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
不正经学生1 天前
C 语言函数深入剖析(基础篇)—— 从零理解函数的每一个细节
c语言·开发语言·数据结构·算法·c#