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

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

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

#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) 时,整个表达式结果已确定为真,第二个操作数不会被执行

#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:避免空指针解引用

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

#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:数组边界检查

#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:函数调用优化

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

记住关键点:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值