逻辑运算符的短路行为
短路是一种在能够时跳过评估(if / while / …)条件的部分的功能。如果对两个操作数进行逻辑运算,则计算第一个操作数(为真或假),如果有判定(即使用&&时第一个操作数为 false,则在使用||时第一个操作数为 true)第二个操作数为没有评估。
例:
#include <stdio.h>
int main(void) {
int a = 20;
int b = -5;
/* here 'b == -5' is not evaluated,
since a 'a != 20' is false. */
if (a != 20 && b == -5) {
printf("I won't be printed!\n");
}
return 0;
}
自己检查一下:
#include <stdio.h>
int print(int i) {
printf("print function %d\n", i);
return i;
}
int main(void) {
int a = 20;
/* here 'print(a)' is not called,
since a 'a != 20' is false. */
if (a != 20 && print(a)) {
printf("I won't be printed!\n");
}
/* here 'print(a)' is called,
since a 'a == 20' is true. */
if (a == 20 && print(a)) {
printf("I will be printed!\n");
}
return 0;
}
输出:
$ ./a.out
print function 20
I will be printed!
当你想要避免评估(计算上)昂贵的术语时,短路很重要。此外,它会严重影响程序的流程,就像在这种情况下: 为什么这个程序打印“分叉!” 4 次?