邏輯運算子

邏輯和

如果兩個運算元都為非零,則執行兩個運算元的邏輯布林 AND,返回 1。邏輯 AND 運算子的型別為 int

0 && 0  /* Returns 0. */
0 && 1  /* Returns 0. */
2 && 0  /* Returns 0. */
2 && 3  /* Returns 1. */

邏輯或

如果任何運算元非零,則執行兩個運算元的邏輯布林 OR 運算,返回 1。邏輯 OR 運算子的型別為 int

0 || 0  /* Returns 0. */
0 || 1  /* Returns 1.  */
2 || 0  /* Returns 1.  */
2 || 3  /* Returns 1.  */

邏輯不

執行邏輯否定。邏輯 NOT 運算子的型別為 int。NOT 運算子檢查至少有一位是否等於 1,如果是,則返回 0.否則返回 1;

!1 /* Returns 0. */
!5 /* Returns 0. */
!0 /* Returns 1. */

短路評估

&&||有一些共同的關鍵屬性:

  • 在評估右手運算元(RHS)之前,對左手運算元(LHS)進行了全面評估,
  • 在左手運算元和右手運算元的評估之間有一個序列點,
  • 並且,最重要的是,如果左側運算元的結果決定了整體結果,則根本不評估右側運算元。

這意味著:

  • 如果 LHS 評估為’true’(非零),則不會評估||的 RHS(因為’true OR anything’的結果為’true’),
  • 如果 LHS 評估為(零),則不會評估 && 的 RHS(因為’false AND anything’的結果為’false’)。

這很重要,因為它允許你編寫如下程式碼:

const char *name_for_value(int value)
{
    static const char *names[] = { "zero", "one", "two", "three", };
    enum { NUM_NAMES = sizeof(names) / sizeof(names[0]) };
    return (value >= 0 && value < NUM_NAMES) ? names[value] : "infinity";
}

如果將負值傳遞給函式,則 value >= 0 項的計算結果為 false,並且不評估 value < NUM_NAMES 項。