第 5 章系統梳理 C 運算符優先級(高→低)、結合性,並強調副作用、序列點與未定義行為的關鍵區別。
| 優先級 | 運算符 | 結合性 | 說明 |
|---|---|---|---|
| 1 | () [] -> . | 左→右 | 函數調用、數組下標、結構體成員 |
| 2 | ++ -- + - ! ~ * & (type) sizeof | 右→左 | 一元運算符 |
| 3 | * / % | 左→右 | 乘除模 |
| 4 | + - | 左→右 | 加減 |
| 5 | << >> | 左→右 | 移位 |
| 6 | < <= > >= | 左→右 | 關係 |
| 7 | == != | 左→右 | 相等性 |
| 8 | & | 左→右 | 按位與 |
| 9 | ^ | 左→右 | 按位異或 |
| 10 | | | 左→右 | 按位或 |
| 11 | && | 左→右 | 邏輯與(短路) |
| 12 | || | 左→右 | 邏輯或(短路) |
| 13 | ?: | 右→左 | 條件運算符 |
| 14 | = += -= *= ... | 右→左 | 賦值 |
| 15 | , | 左→右 | 逗號運算符 |
;、&&/||/?:/,、函數調用前後)a = a++;、printf("%d %d", i++, i);、*p++ = *q++;(此處合法,因修改不同對象)a() + b() 中 a/b 調用順序p + n:地址增加 n * sizeof(*p) 位組p - q:返回元素個數差(ptrdiff_t),要求指向同一數組== != < > <= >=,同一數組內比較位置int a = 5;
printf("%d %d %d\n", a++, ++a, a); // UB:參數求值順序未指定,且 a 多次修改
// 正確寫法:分語句
int b = a++;
int c = ++a;
printf("%d %d %d\n", b, c, a);
if (p && *p > 0)