【C语言】逻辑操作符的短路问题

举报
倔强的石头_ 发表于 2024/11/30 19:35:15 2024/11/30
【摘要】 C语⾔逻辑运算符的一个特点—— 它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。


引言

C 语⾔逻辑运算符的一个特点 ——


它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为 “短路”。


一、&& 逻辑与操作符


两边都为真则结果为真,一边为假则结果为假。


对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执⾏ (左边操作数的结果是 0 的时候,右边不必判断也是假)。


以下是代码示例来说明逻辑与操作符的短路求值问题:
#include <stdio.h>

int main() {
    int a = 0;
    int b = 5;
    // 这里由于a的值为0,根据逻辑与的短路特性,++b这部分不会被执行
    if (a && ++b) {
        printf("条件满足\n");
    } else {
        printf("条件不满足,a的值为:%d,b的值为:%d\n", a, b);
    }

    return 0;
}


在上述代码中,a 的值为 0,当执行 if 语句中的条件判断 a && ++b 时,因为逻辑与运算符 && 左边的 a 已经是 0(在 C 语言中,0 表示假),根据逻辑与的短路规则,就不会再去执行右边的 ++b 操作,所以最终输出 b 的值仍然是初始化时的 5。


二、&& 逻辑与操作符短路求值对照组


为了更清晰地对比理解,我们再来看下面这个没有发生短路的代码示例:
#include <stdio.h>

int main() {
    int a = 1;
    int b = 5;
    // 这里因为a的值为1,所以会继续执行++b来判断整个条件
    if (a && ++b) {
        printf("条件满足\n");
    } else {
        printf("条件不满足,a的值为:%d,b的值为:%d\n", a, b);
    }

    return 0;
}


在这个例子中,逻辑与运算符 && 左边的 a 值为 1(在 C 语言中,非 0 表示真),所以会继续执行右边的 ++b 操作,然后再根据 a  ++b 的最终结果来判断整个条件是否满足。


三、|| 逻辑或操作符


两边为假则为假,一边为真则为真。


对于 || 操作符来说,左边操作数的结果是 1 的时候,右边操作数就不再执⾏ (左边操作数的结果是 1 的时候,右边不必判断也是真)。


以下是代码示例来说明逻辑或操作符的短路求值问题:
#include <stdio.h>

int main() {
    int a = 1;
    int b = 5;
    // 由于a的值为1,根据逻辑或的短路特性,++b这部分不会被执行
    if (a || ++b) {
        printf("条件满足\n");
    } else {
        printf("条件不满足,a的值为:%d,b的值为:%d\n", a, b);
    }

    return 0;
}


在上述代码中,a 的值为 1,当执行 if 语句中的条件判断 a || ++b 时,因为逻辑或运算符 || 左边的 a 已经是 1(表示真),根据逻辑或的短路规则,就不会再去执行右边的 ++b 操作,所以最终输出 b 的值仍然是初始化时的 5。


四、|| 逻辑或操作符短路求值对照组


同样,我们来看一个没有发生短路的逻辑或操作符的代码示例:
#include <stdio.h>

int main() {
    int a = 0;
    int b = 5;
    // 这里因为a的值为0,所以会继续执行++b来判断整个条件
    if (a || ++b) {
        printf("条件满足\n");
    } else {
        printf("条件不满足,a的值为:%d,b的值为:%d\n", a, b);
    }

    return 0;
}


在这个例子中,逻辑或运算符 || 左边的 a 值为 0(表示假),所以会继续执行右边的 ++b 操作,然后再根据 a  ++b 的最终结果来判断整个条件是否满足。


通过这些代码示例,我们可以更清楚地理解 C 语言中逻辑运算符的短路求值特性及其在实际编程中的应用。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。