引言
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)