逻辑运算符的短路行为

短路是一种在能够时跳过评估(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 次?