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;
}
总结
短路特性的价值:
-
提高效率:避免不必要的计算
-
增强安全性:防止空指针、数组越界等问题
-
简化代码:可以写出更简洁的条件判断
记住关键点:
-
&&:第一个为假就短路 -
||:第一个为真就短路 -
短路时,第二个操作数完全不会执行