邏輯運算子的短路行為

短路是一種在能夠時跳過評估(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 次?