运算符优先级

运算符从上到下列出,优先级递减。具有相同编号的运算符具有相同的优先级和相同的关联性。

  1. ::
  2. 后缀运算符:[] () T(...) . -> ++ -- dynamic_cast static_cast reinterpret_cast const_cast typeid
  3. 一元前缀运算符:++ -- * & + - ! ~ sizeof new delete delete[]; C 风格的转换表,(T)...; (C++ 11 及以上)sizeof... alignof noexcept
  4. .*->*
  5. */%,二进制算术运算符
  6. +-,二进制算术运算符
  7. <<>>
  8. <><=>=
  9. ==!=
  10. &,按位 AND 运算符
  11. ^
  12. |
  13. &&
  14. ||
  15. ?:(三元条件运算符)
  16. =*=/=%=+=-=>>=<<=&=^=|=
  17. throw
  18. ,(逗号运算符)

赋值,复合赋值和三元条件运算符是右关联的。所有其他二元运算符都是左关联的。

三元条件运算符的规则比简单优先规则可以表达的要复杂一些。

  • 操作数与其左侧的 ? 或右侧的:的绑定程度低于其他任何运算符。实际上,条件运算符的第二个操作数被解析为好像是括号。这允许诸如 a ? b , c : d 的表达在语法上有效。
  • 操作数与其右侧的 ? 绑定比左侧的赋值运算符或 throw 更紧密,因此 a = b ? c : d 相当于 a = (b ? c : d)throw a ? b : c 相当于 throw (a ? b : c)
  • 操作数在其右侧比赋值操作符更紧密地绑定到左侧的:,因此 a ? b : c = d 相当于 a ? b : (c = d)