C++ 运算符优先级与结合性总结

以下是 C++ 运算符优先级与结合性 的总结(从高到低排列),帮助你快速理解表达式计算顺序:

C++ 运算符优先级与结合性速查表

优先级 类别 运算符 结合性
1(最高) 后缀运算符 ()(函数调用)、[](数组下标)、->(指针成员访问)、.(成员访问)、++(后缀自增)、--(后缀自减) 从左到右
2 一元运算符 +(正号)、-(负号)、!(逻辑非)、~(按位取反)、++(前缀自增)、--(前缀自减)、(type)(类型转换)、*(解引用)、&(取地址)、sizeof(求大小) 从右到左
3 乘除运算符 *(乘法)、/(除法)、%(取模) 从左到右
4 加减运算符 +(加法)、-(减法) 从左到右
5 移位运算符 <<(左移)、>>(右移) 从左到右
6 关系运算符 <(小于)、<=(小于等于)、>(大于)、>=(大于等于) 从左到右
7 相等运算符 ==(等于)、!=(不等于) 从左到右
8 位与运算符 &(按位与) 从左到右
9 位异或运算符 ^(按位异或) 从左到右
10 位或运算符 ` `(按位或)
11 逻辑与运算符 &&(逻辑与) 从左到右
12 逻辑或运算符 `
13 条件运算符 ?:(三元条件) 从右到左
14(最低) 赋值运算符 =+=-=*=/=%=>>=<<=&=^=、` =`
15 逗号运算符 ,(逗号) 从左到右

关键说明

  1. 优先级高低

    • 优先级越高的运算符越先被计算。例如:a * b + c 中,*(优先级3)先于 +(优先级4)计算。
    • 若优先级相同,按 结合性 决定计算顺序:
      • 从左到右(如 a + b - c):先算 a + b,再减 c
      • 从右到左(如 a = b = c):先算 b = c,再将结果赋值给 a
  2. 易混淆点

    • 一元运算符 vs 加减运算符
      • ++i(前缀自增,优先级2)比 i++(后缀自增,优先级1)优先级低,但结合性不同(前缀自增为右结合,后缀自增为左结合)。
    • 逻辑运算符 vs 位运算符
      • &&(逻辑与,优先级11)和 ||(逻辑或,优先级12)的优先级远低于位运算符(如 &^|)。例如:a & b && c 等价于 (a & b) && c,而非 a & (b && c)
  3. 括号改变优先级

    • () 显式指定计算顺序,避免依赖默认优先级。例如:(7 + 3) * 2 会先算加法,结果为 20

示例解析

示例1:混合运算符表达式

int a = 10, b = 2, c = 3;
int x = a + b * c % 2;  // 计算顺序:* → % → +
// 步骤:2*3=6 → 6%2=0 → 10+0=10 → x=10

示例2:赋值与条件运算符

int m = 5, n = 3;
int result = m > n ? m++ : --n;  // 条件运算符优先级13,高于赋值运算符(优先级14)
// 步骤:m>n为true → 取m++(后缀自增,优先级1)→ result=5,m变为6

示例3:位运算符与逻辑运算符

bool flag = 3 & 5 || 4 > 6;  // 位与(&,优先级8)先于逻辑或(||,优先级12)
// 步骤:3&5=1(二进制 0011 & 0101 = 0001)→ 1||false= true → flag=true

记忆技巧

  1. 高优先级组
    • 后缀运算符(函数调用、数组下标等)和一元运算符(自增、取地址等)优先级最高。
  2. 算术运算符
    • 乘除取模(*/%)高于加减(+-),移位运算符(<<>>)次之。
  3. 逻辑运算符
    • 关系运算符(<==等)高于逻辑与(&&)和逻辑或(||),位运算符优先级介于关系运算符和逻辑运算符之间。
  4. 低优先级组
    • 条件运算符(?:)、赋值运算符(=)、逗号运算符优先级最低,且多为右结合性。

总结

  • 优先级决定表达式中运算符的计算顺序,结合性决定同级运算符的计算方向。
  • 复杂表达式中建议用 () 明确优先级,避免因记忆偏差导致逻辑错误。
  • 熟练掌握优先级可提高代码可读性和调试效率,尤其在处理位运算、逻辑表达式时需格外注意。C++ 运算符优先级是指在表达式计算中运算符被执行的先后顺序。优先级高的运算符会先被计算,若优先级相同则根据结合性决定计算顺序。以下是 C++ 中运算符优先级的总结:

优先级层级(从高到低)

  1. 后缀运算符()(函数调用)、[](数组下标)、->(指针成员访问)、.(对象成员访问)、++(后缀自增)、--(后缀自减)
    结合性:从左到右

  2. 一元运算符+(正号)、-(负号)、!(逻辑非)、~(按位取反)、++(前缀自增)、--(前缀自减)、(type)(强制类型转换)、*(解引用)、&(取地址)、sizeof
    结合性:从右到左

  3. 算术运算符

    • 乘除模*/%
    • 加减+-
      结合性:从左到右
  4. 移位运算符<<(左移)、>>(右移)
    结合性:从左到右

  5. 关系运算符<<=>>=
    结合性:从左到右

  6. 相等运算符==!=
    结合性:从左到右

  7. 位运算符

    • 位与&
    • 位异或^
    • 位或|
      结合性:从左到右
  8. 逻辑运算符

    • 逻辑与&&
    • 逻辑或||
      结合性:从左到右
  9. 条件运算符?:
    结合性:从右到左

  10. 赋值运算符=+=-=*=/=%=>>=<<=&=^=|=
    结合性:从右到左

  11. 逗号运算符,
    结合性:从左到右

关键点

  • 优先级决定计算顺序:例如 a + b * c 中,* 优先于 +,因此先计算 b * c
  • 结合性处理同级运算:例如 a = b = c 中,赋值运算符从右到左结合,因此先执行 b = c,再执行 a = b
  • 括号改变优先级:显式使用 () 可以强制改变计算顺序,例如 (a + b) * c 先计算加法。

掌握运算符优先级是编写正确、易读代码的基础。在复杂表达式中,建议使用括号明确指定计算顺序,避免依赖默认优先级导致的歧义。

posted @ 2025-06-04 18:22  kkman2000  阅读(367)  评论(0)    收藏  举报