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)非要用長表達式的勤加括號:勤能補拙,安全第一嘛。