首页 >> Nature杂志 > 学识问答 >

问C 运算符优先级 优先级与结合性详解

2026-11-05 09:10:02

答

C 运算符优先级,就是在一条表达式里面,多个运算符同时出现的时候,规定谁先计算谁后计算的顺序规则;而结合性是同一优先级运算符连续出现时,是从左往右算,还是从右往左算,两个概念必须搭配理解,只记优先级很容易出错。优先级最高的是下标中括号、函数调用、成员访问,其次是单目运算符,再到乘除取模,然后加减,之后移位、关系比较、相等判断、位运算、逻辑运算,最后是三目运算符、赋值运算符,逗号运算符优先级最低。考试和日常写代码核心原则:拿不准就加小括号,小括号优先级最高,可以强制改变运算顺序,不需要死记全部优先级,重点记住高频易错层级。C 语言运算符一共分 15 个优先级等级,同一优先级由结合性决定计算方向,单目、三目、赋值类大多是右结合,算术、关系、逻辑大多左结合。

优先级总表(从高到低)

优先级运算符说明结合性
1[] () . ->数组下标、函数调用、结构体成员左结合
2! ~ ++ -- +(正号) -(负号) *(解引用) &(取地址) sizeof单目运算符右结合
3* / %乘法、除法、取模左结合
4+ -加法、减法左结合
5<< >>左移、右移位运算左结合
6< <= > >=关系比较运算符左结合
7== !=等于、不等于左结合
8&按位与左结合
9^按位异或左结合
10|按位或左结合
11&&逻辑与左结合
12||逻辑或左结合
13?:三目条件运算符右结合
14= += -= *= /= %= <<= >>= &= ^= |=赋值、复合赋值右结合
15,逗号运算符左结合

重点核心要点

  1. 单目运算符优先级高于双目算术运算
  2. 关系运算符 > == !=

比如 -a * b,是先取负得到 - a,再做乘法,不是先 a*b 再取负

= 高于 == !=,很多同学容易踩坑:a > b == c,是先算 a>b 得到真假,再和 c 比较

  1. 位运算优先级低于关系运算符
  2. 逻辑与 && 高于逻辑或 ||
  3. 赋值运算符优先级很低
  4. 逗号运算符优先级最低

& ^ | 优先级比 <> == 更低,所以写 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 语言规范,不同编译器对扩展运算符支持略有差异,表达式求值顺序部分场景属于未指定行为,内容仅用于学习备考参考,实际项目推荐使用小括号明确运算顺序。

  免责声明:本答案或内容为用户上传,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。 如遇侵权请及时联系本站删除。

 

相关阅读

最新文章