C-運算子優先順序一個小例子
阿新 • • 發佈:2019-02-10
程式碼
比如有下面一段程式碼:
#include <stdio.h>
int main()
{
int a = 0x02;
int b = 0x20;
int ret = 0;
const int MASK = 0x02;
ret = a & MASK != MASK;
printf("ret = %d\n", ret);
ret = b & MASK != MASK;
printf("ret = %d\n", ret);
return 0;
}
關鍵點
主要關注如下程式碼塊:
a & MASK != MASK
原作者的含義,估計是對一個數值進行掩碼計算,然後判斷是否為預期的這個掩碼。從程式碼的層面講,原作者認為是先做左邊的&運算,再做右邊的!=運算。
而從C的運算子優先順序的角度來講,上述程式碼等價於:
a & (MASK != MASK)
如此,易於知道這個計算的最終結果永遠為0!
編譯器版本
上述程式碼在VC6上編譯無告警(不管編譯高階改成哪個級別),而在VS2010(或其他VC6更高版本)上則有如下告警:
warning C4554: “&”: 檢查運算子優先順序可能存在的錯誤;使用圓括號闡明優先順序
因為VC6上沒有告警,所以上述問題會持續遺留在程式碼中。
正確的做法
在瞭解到運算子優先順序之後,知道正確的寫法應為:
(a & MASK) != MASK
另外,可以嘗試加或不加括號,對比程式的執行結果。