C++运算符的优先级

  1. 运算符优先级表
  2. 注释

运算符优先级表

  • 第一级
运算符 描述
:: 作用域解析
  • 第二级
运算符 描述
a++ a– 后缀自增/自减
type() type{} 函数风格转型
a() 函数调用
a[] 数组下标
. -> 成员访问
  • 第三级
运算符 描述
++a –a 前缀自增/自减
+a -a 一元加/减
! ~ 逻辑非/逐位非
(type) C风格转型
*a 解引(析)
&a 取地址
sizeof 取大小
new 动态内存分配
delete 动态内存分配
  • 第四级
运算符 描述
.* ->* 成员指针
  • 第五级
运算符 描述
* / % 乘除取余
  • 第六级
运算符 描述
+ - 加减
  • 第七级
运算符 描述
\<\< >> 左移右移
  • 第八级
运算符 描述
\<=> 三路比较运算符
  • 第九级
运算符 描述
> >= \< \<= 关系运算符
  • 第十级
运算符 描述
== != 关系运算符
  • 第十一级
运算符 描述
& 逐位与
  • 第十二级
运算符 描述
^ 逐位异或
  • 第十三级
运算符 描述
| 逐位或
  • 第十四级
运算符 描述
&& 逻辑与
  • 第十五级
运算符 描述
|| 逻辑或
  • 第十六级
运算符 描述
?: 三元条件运算符
= += -= *= /= %= \<\<= >>= &= ^= =
  • 第十七级
运算符 描述
逗号

注释

  1. 拥有相同优先级的运算符以其结合性的方向与各参数绑定。例如表达式 a = b = c 被分析为 a = (b = c) 而非 (a = b) = c,因为赋值具有从右到左结合性,但 a + b - c 被分析为 (a + b) - c 而非 a + (b - c),因为加法和减法具有从左到右结合性。
  2. 结合性规定对于一元运算符是冗余的,只为完备而给出:一元前缀运算符始终从右到左结合(delete ++*p 为 delete(++(*p)))而一元后缀运算符始终从左到右结合(a[1][2]++ 为 ((a[1])[2])++)。要注意,结合性对成员访问运算符是有意义的,即使在它们与一元后缀运算符组合时也是如此:a.b++ 分析为 (a.b)++ 而非 a.(b++)。
  3. 运算符优先级不受运算符重载影响。例如,std::cout \<\< a ? b : c; 分析为 (std::cout \<\< a) ? b : c;,因为算术左移的优先级高于条件运算符
  4. sizeof 的操作数不能是 C 风格转型:表达式 sizeof (int) * p 无歧义地解释成 (sizeof(int)) * p ,而非 sizeof((int)*p)
  5. 方便记忆:优先查看域解析、一元后缀排第二、一元前缀不落下、成员四则和移位、比较优先比大小、逻辑还看与异或、赋值逗号定乾坤。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:C++运算符的优先级

本文作者:红尘追风

发布时间:2015-02-15, 14:55:12

原始链接:http://www.micernel.com/2015/02/15/C++%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录