【C進階】15、邏輯運算子

bryson發表於2021-10-07

Summary

1)&&表示式從左向右計算,當遇到條件為假時,整個表示式為假,後面的表示式都不再執行,是為短路規則

2) ||表示式從左向右計算,當遇到條件為真時,整個表示式為真,後面的表示式都不再執行,是為短路規則

3)邏輯表示式中&&比||的優先順序更高,表現為:當&&和||在同一個表示式中出現時,整個表示式被看作一個||表示式。先計算&&表示式,最後計算整個的||表示式,某個表示式為真的時候,整個||表示式就短路了。

4)C語言中的邏輯非"!"只認識0(假),其他的任何值都是非0(真)
"!"常用於if語句中判斷表示式是否為假;也可用於將一個整數變為1,如!!100;

邏輯運算子的隱蔽知識點

1、&& 和 || 中的短路規則

  • || 從左向右開始計算:當遇到條件為真時停止計算,整個表示式為真;所有條件都為假時表示式才為假

    int LogicFunc(int i)
    {
      printf("LogicFunc(int i) : %d\n", i);
      return i;
    }
    
    int main()
    {
    
      if(LogicFunc(1) || LogicFunc(0))
      {
          printf("Logic expression is true");
      }
      else
      {
          printf("Logic expression is false");
    
      }
    }
    輸出:
    LogicFunc(int i) : 1
    Logic expression is true
    
    原因:邏輯||表示式的短路規則,第1個表示式LogicFunc(1)返回1,為true,第二個表示式由於短路規則並未執行
  • && 從左向右開始計算:當遇到條件為假時停止計算,整個表示式為假;所有條件都為真時表示式才為真

    int LogicFunc(int i)
    {
      printf("LogicFunc(int i) : %d\n", i);
      return i;
    }
    
    int main()
    {
    
      if(LogicFunc(0) && LogicFunc(1))
      {
          printf("Logic expression is true");
      }
      else
      {
          printf("Logic expression is false");
    
      }
    }
    輸出:
    LogicFunc(int i) : 0
    Logic expression is false
    
    原因:邏輯&&表示式的短路規則,第1個表示式LogicFunc(0)返回0,false,第二個表示式由於短路規則並未執行

2、&& 和 || 混合運算時的規則

邏輯表示式中&&比||的優先順序更高,表現為:當&&和||在同一個表示式中出現時,整個表示式被看作一個||表示式。先計算&&,最後計算||。

  • 程式碼閱讀

    // 以下程式碼的輸出是?
      int i = 0;
      int j = 0;
      int k = 0;
    
      int t = ++i || ++j && ++k;
    
      printf("t = %d\n", t);
      printf("i = %d\n", i);
      printf("j = %d\n", j);
      printf("k = %d\n", k);
  • 程式碼分析

    輸出:
    t = 1
    i = 1
    j = 0
    k = 0
    
    分析:
    ++i || ++j && ++k;  ==> 等價於一個邏輯或表示式 (1 && ++i) || (++j && ++k);
    左邊的邏輯與表示,1為真,繼續計算++i,i自增1,然後取值,所以左側表示式也為真
    這時候遇到了邏輯或表示式的短路規則:左側表示式已經為真,右側的表示式不再計算。
    因此,j和k仍然為0

3、"!"究竟是神馬

C語言中的邏輯非運算子只認得0,碰見0就返回1;否則就返回0;

    printf("%d\n", !0);        // 1
    printf("%d\n", !-1);       // 0
    printf("%d\n", !100);      // 0
    printf("%d\n", !!100);     // 1

本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。

相關文章