眾多國內 C 教材 (如譚浩強《C程序設計》) 附錄將 所有單目運算符歸為優先級 2、結合性右→左:
優先級 2 (單目運算符) : ! ~ ++ -- - (type) * & sizeof <-- 錯誤!全部同級
**這完全違背 C 標準**。實際上:sizeof、_Alignof、一元 &、*、+、-、~、! 屬於**一元運算符**,優先級**高於**類型轉換運算符 (type)。
int i = 3;
printf("%zu\n", sizeof (int *) & i); // 輸出 ?
按錯誤理論:sizeof、(int*)、& 同級右結合 → sizeof ((int*)&i) → 結果應等於 sizeof(int*) (4 或 8)。
實際運行 (GCC/MSVC):輸出 0 或 4 (視 i 值) —— 表達式被解析為 (sizeof (int *)) & i,即 **sizeof 結果與 i 做按位與**!
| 優先級 (高→低) | 運算符 | 結合性 | 備註 |
|---|---|---|---|
| 1 | () [] -> . | 左→右 | 後綴/主運算符 |
| 2 | ++ -- (type) * & + - ~ ! sizeof _Alignof | 右→左 | **一元運算符** (含 sizeof、類型轉換) |
| 3 | * / % | 左→右 | 乘法性 |
| ... | ... | ... | ... |
關鍵細節:雖同屬優先級 2,**結合性右→左意味著運算符只能作用於右側「優先級 ≥ 當前」的表達式**。
sizeof (int *):(int*) 是類型名 (非表達式),合法。sizeof (int *) & i:sizeof 作用於右側 (int*) (高級表達式) 得到值,再與 i 做 & (二元按位與)。(int*)&i 取大小,**必須加括號**構成主表達式:sizeof ((int *)&i)。+,3*5 是高級表達式。+,2+3 是同級,a=b 不是 (含 = 更低)。sizeof (編譯期運算符) 與 (type) (類型轉換) 的本質區別。sizeof (int *) & i 這類邊界案例。**單目運算符優先級不完全相同**!
sizeof、一元&、* 等優先級**高於**類型轉換(type)。遇到混合單目運算符表達式,**務必加括號**明確意圖,勿信直覺與錯誤表格。
推薦參考:cppreference Operator Precedence — 權威、機器可驗證、持續更新。