
“*p++到底先算哪个?” “为什么a & b == c和我想的不一样?” “每次写复杂表达式都要试半天…”
相信每个C程序员都曾为运算符优先级抓狂过!网上的资料要么不全,要么解释不清,每次要用的时候死活找不到想要的。经过无数次踩坑和整理,我终于总结出了这份最全最实用的C语言运算符优先级指南,分享给同样被这个问题困扰的你!
优先级 | 运算符 | 描述 | 结合性 | 示例 |
|---|---|---|---|---|
1 | () [] -> . :: ++ -- | 函数调用/数组下标/成员访问/后置自增自减 | 左到右 | arr[2], obj.member, i++ |
2 | ++ -- + - ! ~ (type) * & sizeof | 前置自增自减/正负号/逻辑非/按位取反/强制类型转换/解引用/取地址/大小计算 | 右到左 | ++i, -num, !flag, *ptr |
3 | * / % | 乘除取模 | 左到右 | a * b, 5 % 2 |
4 | + - | 加减 | 左到右 | x + y - z |
5 | << >> | 位移 | 左到右 | n << 2, val >> 1 |
6 | < <= > >= | 关系比较 | 左到右 | a > b, x <= y |
7 | == != | 相等比较 | 左到右 | x == y, a != 0 |
8 | & | 按位与 | 左到右 | flags & MASK |
9 | ^ | 按位异或 | 左到右 | a ^ b |
10 | | | 按位或 | 左到右 | opt1 | opt2 |
11 | && | 逻辑与 | 左到右 | cond1 && cond2 |
12 | || | 逻辑或 | 左到右 | flag1 || flag2 |
13 | ?: | 条件运算符 | 右到左 | x > 0 ? x : -x |
14 | = += -= *= /= %= <<= >>= &= ^= |= | 赋值运算符 | 右到左 | a = b, x += 5 |
15 | , | 逗号运算符 | 左到右 | i++, j-- |
优先级规则:
常见易错点:
*p++; // 等价于 *(p++)
a & b == c; // 等价于 a & (b == c)