C语言学习
前言:每个C程序员都经历过的痛
“*p++到底先算哪个?”
“为什么a & b == c和我想的不一样?”
“每次写复杂表达式都要试半天…”
相信每个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)