運算符優先級決定表達式求值順序,掌握它是寫出正確代碼的前提。本文提供完整優先級表、記憶口訣、高頻易錯點。
| 級 | 運算符 | 名稱 | 結合性 |
|---|---|---|---|
| 1 | [] () . -> | 下標、調用、成員訪問 | 左→右 |
| 2 | ! ~ ++ -- + - * & (type) sizeof | 單目運算符 | 右→左 |
| 3 | * / % | 乘除模 | 左→右 |
| 4 | + - | 加減 | 左→右 |
| 5 | << >> | 移位 | 左→右 |
| 6 | < <= > >= | 關係比較 | 左→右 |
| 7 | == != | 相等比較 | 左→右 |
| 8 | & | 按位與 | 左→右 |
| 9 | ^ | 按位異或 | 左→右 |
| 10 | | | 按位或 | 左→右 |
| 11 | && | 邏輯與 | 左→右 |
| 12 | || | 邏輯或 | 左→右 |
| 13 | ?: | 條件運算符 | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= | 賦值運算符 | 右→左 |
| 15 | , | 逗號運算符 | 左→右 |
括號成員第一; // [] () . -> 全體單目第二; // 所有單目運算符 乘除模三,加減四; // * / % → + - 移位五,關係六; // << >> → < <= > >= 等於不等排第七; // == != 位與異或位或; // & ^ | 三分天下八九十; // 對應優先級 8,9,10 邏輯與邏輯或; // && || 十二十一分明; // 優先級 12, 11 條件高於賦值, // ?: > = 逗號運算級最低! // , 最後
a[i]++ 先下標後自增;p->field 等價 (*p).field*p++ = *(p++) 先取值後指針後移;++*p 先指針後移後取值a = b = c = a = (b = c)a ? b : c == d = a ? b : (c == d)a || b && c = a || (b && c)a & b == c = a & (b == c) ❌ 易錯,應加括號sizeof int * p = (sizeof int) * p ≠ sizeof (int * p)int a = 1, b = 2, c = 3;
printf("%d\n", a + b * c); // 7,非 9
printf("%d\n", a == b == c); // 0,非語法錯誤:(a==b)==c → 0==3 → 0
printf("%d\n", a = b = c); // 3,a=b=c=3
printf("%d\n", sizeof a + b); // sizeof(a) + b,非 sizeof(a+b)