C陷阱篇之運算符優先級

    C語言運算符有不同優先級,標準裏對這些優先級的規定基本符合人們的正常認知習慣,但其中還有個別容易混淆。其實也不需要死記硬背所有優先級,只要注意幾個例外就可以了:

“+-””>>”運算符

    因爲<<>>某些情況下相當於乘/除2n,很多人總認爲它們的優先級也等於乘除而高於加減,但實際上位運算優先級比加減低。這跟慣常思維不一致,所以當移位加減一起用時一定要注意。比如有人把n*5寫成“res=n<<2+n”,但由於n<<2位的優先級比加法低,結果實際變成“res = n<<(2+n)”,導致bug,要額外加括號改變默認計算順序:res = (n<<2)+n;

運算符”==” ”!=” &^|&&|| 等的優先級

    == != 運算符優先級要高於 &^|&&|| 運算符,但我們一般傾向把==!=作爲邏輯判斷表達式的核心符號,由此形成的默認邏輯就是“先計算兩邊後進行邏輯判斷”,這就錯誤地假設==!=優先級低於其他運算符。比如:

    void main()

    {

      if( 0 & 1 == 0)        printf("0 & 1 == 0\n");

      else      printf("0 & 1 != 0\n");

    }

    結果:0 & 1 != 0。不是某些人認爲的:0 & 1 == 0。因爲if( 0 & 1 == 0) 相當於 if( 0 & (1 == 0) ) 所以執行了else分支。

    這裏不想總結一堆規則去背誦,因爲“淹死的多數會游泳”,死記硬背也免不了疏漏,不確定反而讓人保持警惕。有了這份警惕,對不確定的優先級可以:

    1)分解長表達式:君子不立危牆之下,有簡單安全的可用,幹嘛自找麻煩呢?

    2)非要用長表達式的勤加括號:勤能補拙,安全第一嘛。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章