1. 程式人生 > >C-運算子優先順序一個小例子

C-運算子優先順序一個小例子

程式碼

比如有下面一段程式碼:

#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

另外,可以嘗試加或不加括號,對比程式的執行結果。

附 K&R 2nd的運算子優先順序

C/C++運算子優先順序