C 运算符优先级,就是在一条表达式里面,多个运算符同时出现的时候,规定谁先计算谁后计算的顺序规则;而结合性是同一优先级运算符连续出现时,是从左往右算,还是从右往左算,两个概念必须搭配理解,只记优先级很容易出错。优先级最高的是下标中括号、函数调用、成员访问,其次是单目运算符,再到乘除取模,然后加减,之后移位、关系比较、相等判断、位运算、逻辑运算,最后是三目运算符、赋值运算符,逗号运算符优先级最低。考试和日常写代码核心原则:拿不准就加小括号,小括号优先级最高,可以强制改变运算顺序,不需要死记全部优先级,重点记住高频易错层级。C 语言运算符一共分 15 个优先级等级,同一优先级由结合性决定计算方向,单目、三目、赋值类大多是右结合,算术、关系、逻辑大多左结合。
优先级总表(从高到低)
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1 | [] () . -> | 数组下标、函数调用、结构体成员 | 左结合 |
| 2 | ! ~ ++ -- +(正号) -(负号) *(解引用) &(取地址) sizeof | 单目运算符 | 右结合 |
| 3 | * / % | 乘法、除法、取模 | 左结合 |
| 4 | + - | 加法、减法 | 左结合 |
| 5 | << >> | 左移、右移位运算 | 左结合 |
| 6 | < <= > >= | 关系比较运算符 | 左结合 |
| 7 | == != | 等于、不等于 | 左结合 |
| 8 | & | 按位与 | 左结合 |
| 9 | ^ | 按位异或 | 左结合 |
| 10 | | | 按位或 | 左结合 |
| 11 | && | 逻辑与 | 左结合 |
| 12 | || | 逻辑或 | 左结合 |
| 13 | ?: | 三目条件运算符 | 右结合 |
| 14 | = += -= *= /= %= <<= >>= &= ^= |= | 赋值、复合赋值 | 右结合 |
| 15 | , | 逗号运算符 | 左结合 |
重点核心要点
- 单目运算符优先级高于双目算术运算
- 关系运算符 > == !=
比如 -a * b,是先取负得到 - a,再做乘法,不是先 a*b 再取负
= 高于 == !=,很多同学容易踩坑:a > b == c,是先算 a>b 得到真假,再和 c 比较
- 位运算优先级低于关系运算符
- 逻辑与 && 高于逻辑或 ||
- 赋值运算符优先级很低
- 逗号运算符优先级最低
& ^ | 优先级比 <> == 更低,所以写 if (a & b == 0) 会出错,必须写成 if ((a & b) == 0),这是最高频易错考点
a || b && c,等价 a || (b && c),不是从左到右全部依次算
a = b + c,是先算 b+c,再赋值给 a;复合赋值同样右结合,a = b = c,是 c 先赋值给 b,再赋值给 a
逗号表达式会从左依次执行,整个表达式最终结果是最后一项的值
深度易错要点
第一点 区分优先级和短路特性,&& || 除了优先级,还有短路规则,左边确定结果之后右边不再执行,不要只考虑优先级忘记短路
第二点 sizeof 是运算符,不是函数,属于优先级第 2 级单目运算符
第三点 ++ -- 前置和后置优先级不一样,后置 ++ 优先级高于前置 ++,数组下标场景经常考察 arr [i++]
第四点 不要混淆按位与 & 和逻辑与 &&,二者优先级不一样,是考试大坑
第五点 工程编码规范不推荐依赖默认优先级,复杂表达式统一加小括号,提升可读性,避免维护出错
【常见问题】
问题 1 C 运算符优先级里面,小括号优先级是最高的吗
回答 1 C 运算符优先级里面,小括号可以强制改变运算顺序,优先级高于所有普通运算符,写复杂表达式推荐使用小括号,避免依赖默认优先级出错。
问题 2 C 运算符优先级里面,& 和 && 优先级谁高
回答 2 C 运算符优先级里面,按位与 & 优先级高于逻辑与 &&,按位与在第 8 级,逻辑与 && 在第 11 级,这是非常容易混淆的考点。
问题 3 C 运算符优先级里面,赋值运算符是左结合还是右结合
回答 3 C 运算符优先级里面,赋值以及复合赋值运算符是右结合,连续赋值 a=b=c 是从右向左依次赋值。
问题 4 C 运算符优先级里面,逗号运算符优先级是最高还是最低
回答 4 C 运算符优先级里面,逗号运算符优先级是全部运算符里面最低,逗号表达式从左向右依次运算,最终取值是最后一个子表达式结果。
【免责申明】
本文 C 运算符优先级依据标准 C 语言规范,不同编译器对扩展运算符支持略有差异,表达式求值顺序部分场景属于未指定行为,内容仅用于学习备考参考,实际项目推荐使用小括号明确运算顺序。


