C语言中的运算符非常丰富,大约有40多种,按照功能可以分为以下几类。下面按优先级从高到低整理,并标注结合方向(绝大多数是左结合,只有少数特殊的是右结合)。
运算符分类与优先级完整对照表(C11/C17标准)
| 优先级 | 运算符 | 含义 / 类别 | 结合方向 | 说明 / 常见陷阱 |
|---|---|---|---|---|
| 1 | () | 括号 / 函数调用 | 左→右 | 最高优先级,用于改变顺序 |
| 1 | [] | 数组下标 | 左→右 | |
| 1 | . -> | 结构体/联合体成员访问 | 左→右 | -> 用于指针 |
| 1 | ++ -- (后置) | 后置自增/自减 | 左→右 | i++ 先用后加 |
| 2 | ++ -- (前置) | 前置自增/自减 | 右→左 | ++i 先加后用 |
| 2 | + - (单目) | 正号 / 负号 | 右→左 | |
| 2 | ! ~ | 逻辑非 / 按位取反 | 右→左 | |
| 2 | * (解引用) & (取地址) | 指针解引用 / 取地址 | 右→左 | |
| 2 | (类型) | 强制类型转换 | 右→左 | |
| 2 | sizeof | 求大小(编译期) | 右→左 | sizeof int 需要括号 |
| 3 | * / % | 乘、除、取模 | 左→右 | |
| 4 | + - (双目) | 加、减 | 左→右 | |
| 5 | << >> | 左移、右移 | 左→右 | 位运算,移位次数受限于类型宽度 |
| 6 | < <= > >= | 关系运算符 | 左→右 | |
| 7 | == != | 相等、不等 | 左→右 | |
| 8 | & | 按位与 | 左→右 | |
| 9 | ^ | 按位异或 | 左→右 | |
| 10 | | | 按位或 | 左→右 | |
| 11 | && | 逻辑与(短路) | 左→右 | 左边为假,右边不计算 |
| 12 | || | 逻辑或(短路) | 左→右 | 左边为真,右边不计算 |
| 13 | ?: | 三目条件运算符 | 右→左 | C中唯一的三目运算符 |
| 14 | = += -= *= /= %= | 赋值及复合赋值 | 右→左 | a = b = c 从右向左 |
| 14 | &= ^= |= <<= >>= | 位复合赋值 | 右→左 | |
| 15 | , | 逗号运算符(顺序求值) | 左→右 | 优先级最低,整个表达式值是最后一个子表达式的值 |
常见分类速记(按功能分组)
| 类别 | 运算符 | 优先级范围 | 结合方向 | 备注 |
|---|---|---|---|---|
| 算术 | + - * / % ++ -- | 2~4 | 左→右(自增自减除外) | |
| 移位 | << >> | 5 | 左→右 | |
| 关系 | < <= > >= == != | 6~7 | 左→右 | |
| 位运算 | & ^ | ~ | 8~10,2 | 左→右(~除外) | 优先级低于比较,高于逻辑 |
| 逻辑 | && || ! | 11~12,2 | 左→右(!除外) | 短路求值 |
| 条件 | ?: | 13 | 右→左 | |
| 赋值 | = += 等 | 14 | 右→左 | 复合赋值与普通赋值同级 |
| 顺序 | , | 15 | 左→右 | 最低,常用于for循环 |
| 其他 | sizeof (类型) & * . -> [] () | 1~2 | 混合 | 单目大多右结合 |
经典易错例子(强烈建议自己跑一遍)
int a = 5, b = 3, c = 2;
int x;
// 这些表达式的值分别是多少?
x = a + b * c; // 11 (先 * 后 +)
x = a++ + ++b; // 9 (a先用5再+1, b先+1成4再用)
x = a > b ? a : b++; // 5 (三目右结合,但这里不影响)
x = a & b == 1; // 0 (== 优先级高于 &,相当于 a & (b==1))
x = !a && b++; // 0 (短路,b++不执行)
x = (a=2, a+=3, a*4); // 20 (逗号表达式,整个值是最后一个)
记忆口诀(面试/刷题常用)
- 括号 > 单目 > 算术 > 移位 > 关系 > 位运算 > 逻辑 > 条件 > 赋值 > 逗号
- 单目、赋值、三目 → 右结合(其他几乎都是左结合)
- 位运算优先级低于比较运算符(最经典陷阱:
a & b == 0要加括号) - 逻辑与或短路(&& || 不要写有副作用的右表达式)
- 后置 ++ — 高于前置(但只差一级,且都在单目层)
如果你想针对某类运算符(位运算、逻辑、赋值等)做更详细的例子、陷阱题或优先级推导过程,可以直接告诉我,我继续展开~