C优先级

在 C/C++ 编程中,理解运算符优先级是避免逻辑错误的基石。正如数学中“先乘除后加减”一样,C++ 将运算符分成了 16 个优先级层级

为了方便记忆,我们可以将这些运算符分为几个主要组别,按照 从高到低 的顺序排列:


1. 顶级:成员访问与后缀运算符

这些运算符的结合性最强,最先被处理。

  • ():圆括号(函数调用、表达式分组)
  • []:数组下标
  • -> , .:成员访问(指针访问和对象访问)
  • ++ , --后缀自增/自减(注意:优先级高于前缀版本)

2. 单目运算符(一元)

这一层级具有“右结合性”(从右向左运算)。

  • ++ , --前缀自增/自减
  • ! , ~:逻辑非、按位取反
  • * , &:解引用、取地址
  • (type):强制类型转换
  • sizeof:获取类型大小
  • new , delete:动态内存管理

3. 算术运算符

遵循常规数学逻辑,但位移运算在其后。

  • * , / , %:乘、除、取模
  • + , -:加、减

4. 位移与关系运算符

这是最容易出错的地方,关系运算符优先级高于位运算。

  • << , >>:左移、右移
  • < , <= , > , >=:大小比较
  • == , !=相等/不等

5. 位运算符(按位)

注意:位运算符之间的优先级也是不同的,与 > 异或 > 或

  • &:按位与
  • ^:按位异或
  • |:按位或

6. 逻辑运算符(短路运算)

  • &&:逻辑与
  • ||:逻辑或

7. 条件、赋值及其他

  • ? ::三目条件运算符
  • = , += , -= , &= 等:所有赋值运算符(右结合性)
  • ,:逗号运算符(最低优先级)

运算符优先级简表

优先级类别运算符示例结合性
1最高() [] -> .左到右
2单目! ~ ++ -- * &右到左
3乘除* / %左到右
4加减+ -左到右
5位移<< >>左到右
6关系< > == !=左到右
7位运算& ^ |左到右
8逻辑&& ||左到右
9赋值= += *=右到左
10最低,左到右

💡 记忆口诀与避坑指南

  1. 括号万能:如果不确定 &== 谁先运行,无脑加圆括号 ()。这不仅能保证正确性,还能显著提高代码可读性。
  2. 比较运算符高于位运算:记住 if (x & 1 == 0) 实际上会被解释为 if (x & (1 == 0)),这通常不是你想要的结果。
  3. 赋值最慢:赋值运算符几乎是优先级最低的,所以 x = a + b 永远是先算加法再赋值。
  4. 前缀后缀*ptr++ 等同于 *(ptr++),即先取出指针指向的值,然后指针自增。

1人评论了“C优先级”

发表评论

滚动至顶部