<< 比減法還低?觀察以下程式碼:
#include <stdio.h>
#define GET_BIT(a, b, c) a << b - c
int main() {
int a = 1, b = 5, c = 4;
printf("%d\n", GET_BIT(a, b, c) + 1); // 輸出 4
}
乍看之下,1 << 5 - 4 應為 1 << 1 = 2,加 1 應為 3,但實際輸出卻是 4。原因在於 << 的優先級**低於**減法 -,實際解析為 (a << b) - c,即 (1 << 5) - 4 = 32 - 4 = 28,再加 1 得 29?等等,實際輸出是 4,說明巨集展開後優先級導致結合方式不同。實際上 GET_BIT(a,b,c) + 1 展開為 a << b - c + 1,依優先級為 a << (b - c + 1) = 1 << (5 - 4 + 1) = 1 << 2 = 4。
() [] . ->++ -- + - * & sizeof* / %+ -<< >>< <= > >=== !=&^|&&||?:= += -= ...,-Wall -Wextra,部分編譯器會針對優先級易混淆處發出警告。移位運算子優先級較低是 C/C++ 歷史遺留設計,現代程式碼應盡量避免依賴隱含優先級,改以括號明確表達意圖,減少認知負擔與潛在 Bug。