C++ 运算符优先级列表

运算符的优先级和结合性

运算符是告诉编译程序执行特定算术或逻辑操作的符号。

C语言的运算范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。

主要分为三大类:算术运算符、关系运算符与逻辑运算符。

除此之外,还有一些用于完成特殊任务的运算符。 

运算符的优先级与结合性

优先级:

C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。

在表达式中,优先级较高的先于优先级较低的进行运算。

而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。


结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。

例如算术运算符的结合性是自左至右,即先左后右。

如有表达式x-y+z则y应先与"-"号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为"左结合性"。

而自右至左的结合方向称为"右结合性"。最典型的右结合性运算符是赋值运算符。

如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

 

优先级结合性运算符备注
1左结合()
[]
->
.
圆括号
下标运算符
指向结构体成员运算符
结构体成员运算符
2右结合!
~
++
--
+
-
(类型)
*
&
sizeof
逻辑非运算符
按位取反运算符
前缀增量运算符
前缀减量运算符
正号运算符
负号运算符
类型转换运算符
指针运算符
地址运算符
长度运算符
3左结合*
/
%
乘法运算符
除法运算符
取余运算符
4左结合+
-
加法运算符
减法运算符
5左结合<<
>>
左移运算符
右移运算符
6左结合<
<=
>
>=
关系运算符
7左结合==
!=
等于运算符
不等于运算符
8左结合&按位与运算符
9左结合^按位异或运算符
10结合性|按位或运算符
11左结合&&逻辑与运算符
12左结合||逻辑或运算符
13右结合? :条件运算符
14右结合=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
赋值运算符
15左结合,逗号运算符

 

 

优先级口诀:

 
圆方括号、箭头一句号,自增自减非反负、针强地址长度,乘除,加减,再移位,小等大等、等等不等,八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。 

口诀解释:

“圆方括号、箭头一句号”指的是第15级的运算符。
其中圆方括号很明显“()、[]”,箭头指的是指向结构体成员运算符“->”,句号指的是结构体成员运算符“.”。

“自增自减非反负、针强地址长度”指的是第14级的运算符。
其中非指的是逻辑运算符“!”,反指的是按位取反运算符“~”,负指的是负号运算符“-”,针指的是指针运算符“*”,
强指的是强制类型转换运算符,地址指的是地址运算符“&”,长度指的是长度运算符“sizeof”。

“乘除,加减,再移位”移位指的是左移运算符“<<”和右移运算符“>>”,其中除法还包括了取余运算符“%”。

“小等大等、等等不等”指的是第10级到第9级的运算符:<、<=、>和>=,等等指的是等于运算符==,不等指的是不等于运算符!=。

“八位与,七位异,六位或”其中 八位与指的是第8级的按位与运算符“&”,七位异指的是第7级的按位异或运算符“^”,六位或指的是第6级的按位或运算符“|”。

“五与,四或”指的是第5级、第4级的逻辑与运算符“&&”和逻辑或运算符“||”。

“三疑,二赋,一真逗”指的是第3级到第1级的运算符。
其中,三疑指的是条件运算符“?:”(三有双重含义:即指优先级别是三,它的运算符类型也是三目,疑也取“?”之意),
二赋指的是赋值运算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,
一真逗指的是第1级的“,”运算符,真字只是为了语句需要罢了。

由于C语言的运算符优先级与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.

但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先级的!

当然,如果真的不想背这些优先级,那么可以在每次使用符号的地方都用上(),这样就不用在意运算符优先级了,这也是一个很好的编程习惯。

 

 

优先级
运算符
名称或含义
使用形式
结合方向
说明
1
[]
数组下标
数组名[常量表达式]
左到右
 
()
圆括号
(表达式)/函数名(形参表)
 
.
成员选择(对象)
对象.成员名
 
->
成员选择(指针)
对象指针->成员名
 
2
-
负号运算符
-表达式
右到左
单目运算符
(类型)
强制类型转换
(数据类型)表达式
 
++
自增运算符
++变量名/变量名++
单目运算符
--
自减运算符
--变量名/变量名--
单目运算符
*
取值运算符
*指针变量
单目运算符
&
取地址运算符
&变量名
单目运算符
!
逻辑非运算符
!表达式
单目运算符
~
按位取反运算符
~表达式
单目运算符
sizeof
长度运算符
sizeof(表达式)
 
3
/
表达式/表达式
左到右
双目运算符
*
表达式*表达式
双目运算符
%
余数(取模)
整型表达式/整型表达式
双目运算符
4
+
表达式+表达式
左到右
双目运算符
-
表达式-表达式
双目运算符
5
<<
左移
变量<<表达式
左到右
双目运算符
>>
右移
变量>>表达式
双目运算符
6
>
大于
表达式>表达式
左到右
双目运算符
>=
大于等于
表达式>=表达式
双目运算符
<
小于
表达式<表达式
双目运算符
<=
小于等于
表达式<=表达式
双目运算符
7
==
等于
表达式==表达式
左到右
双目运算符
!=
不等于
表达式!= 表达式
双目运算符
8
&
按位与
表达式&表达式
左到右
双目运算符
9
^
按位异或
表达式^表达式
左到右
双目运算符
10
|
按位或
表达式|表达式
左到右
双目运算符
11
&&
逻辑与
表达式&&表达式
左到右
双目运算符
12
||
逻辑或
表达式||表达式
左到右
双目运算符
13
?:
条件运算符
表达式1? 表达式2: 表达式3
右到左
三目运算符
14
=
赋值运算符
变量=表达式
右到左
 
/=
除后赋值
变量/=表达式
 
*=
乘后赋值
变量*=表达式
 
%=
取模后赋值
变量%=表达式
 
+=
加后赋值
变量+=表达式
 
-=
减后赋值
变量-=表达式
 
<<=
左移后赋值
变量<<=表达式
 
>>=
右移后赋值
变量>>=表达式
 
&=
按位与后赋值
变量&=表达式
 
^=
按位异或后赋值
变量^=表达式
 
|=
按位或后赋值
变量|=表达式
 
15
,
逗号运算符
表达式,表达式,…
左到右
从左向右顺序运算

 

C语言运算符优先级和口诀

 

一共有十五个优先级: 

1   ()  []  .  ->

2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 

3   * / %

4   + - 

5   >> <<  

6   > >= < <= 

7   == !=   

8   &  

9   ^   

10  |   

11  &&

12  ||

13  ?:

14   =  +=  -=  *=  /=   %=  |=   ^=   &=   >>=   <<=

15  ,

就着多吧   结合性:2   13  14  是从右至左   其他都是  从左至右 


括号成员第一;        //括号运算符[]() 成员运算符.  ->

全体单目第二;        //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&乘除余三,加减四;   //这个"余"是指取余运算即%

移位五,关系六;    //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;    //即== 和!=

位与异或和位或;    //这几个都是位运算: 位与(&)异或(^)位或(|)    

"三分天下"八九十;  

逻辑或跟与;            //逻辑运算符:|| 和 &&

十二和十一;            //注意顺序:优先级(||)  底于 优先级(&&) 

条件高于赋值,        //三目运算符优先级排到13 位只比赋值运算符和","高

逗号运算级最低!    //逗号运算符优先级最低 

C语言运算符优先级

 

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

(表达式)/函数名(形参表)

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

 

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

 

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

 

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

 

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

 

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位或后赋值

变量|=表达式

--

 

15

逗号运算符

表达式,表达式,…

左到右

--

 

说明: 同一优先级的运算符,运算次序由结合方向所决定。

 

C++ 运算符优先级和关联性

C++ 语言包括所有 C 运算符并添加多个新的运算符。 运算符指定对一个或多个操作数执行的计算。

运算符优先级别指定包含多个运算符的表达式中的运算顺序。 运算符关联性指定,在包含多个具有相同优先级别的运算符的表达式中,操作数与其左侧还是右侧的操作数组合。 下表显示 C++ 运算符的优先级别和关联性(从最高优先级别到最低优先级别)。 优先级别编号相同的运算符具有等同的优先级别,除非由括号显式施加另一种关系。

C++ 运算符的优先级别和关联性

运算符说明

运算符

Group 1 precedence, no associativity

范围解析

::

Group 2 precedence, left to right associativity

成员选择(对象或指针)

. or –>

数组下标

[ ]

函数调用

( )

后缀递增

++

后缀递减

––

类型名称

typeid( )

常量类型转换

const_cast

动态类型转换

dynamic_cast

重新解释的类型转换

reinterpret_cast

静态类型转换

static_cast

Group 3 precedence, right to left associativity

对象或类型的大小

sizeof

前缀递增

++

前缀递减

––

二进制反码

~

逻辑“非”

!

一元求反

-

一元加

+

address-of

&

间接寻址

*

创建对象

new

销毁对象

delete

Cast

Cast: ()

Group 4 precedence, left to right associativity

指向成员的指针(对象或指针)

.* or –>*

Group 5 precedence, left to right associativity

乘法

*

除法

/

取模

%

Group 6 precedence, left to right associativity

添加

+

减法

Group 7 precedence, left to right associativity

左移

<<

右移

>>

Group 8 precedence, left to right associativity

小于

<

大于

>

小于或等于

<=

大于或等于

>=

Group 9 precedence, left to right associativity

相等

==

不相等

!=

Group 10 precedence left to right associativity

按位“与”

&

Group 11 precedence, left to right associativity

按位“异或”

^

Group 12 precedence, left to right associativity

按位“与或”

|

Group 13 precedence, left to right associativity

逻辑“与”

&&

Group 14 precedence, left to right associativity

逻辑“或”

||

Group 15 precedence, right to left associativity

条件运算

? :

Group 16 precedence, right to left associativity

赋值

=

乘法赋值

*=

除法赋值

/=

取模赋值

%=

加法赋值

+=

减法赋值

–=

左移赋值

<<=

右移赋值

>>=

按位“与”赋值

&=

按位“与或”赋值

|=

按位“异或”赋值

^=

Group 17 precedence, right to left associativity

引发表达式

throw

Group 18 precedence, left to right associativity

逗号

,

 

http://www.cppreference.com/operator_precedence.html 

 

PrecedenceOperatorDescriptionExampleAssociativity
1 ()
[]
->
.
::
++
--
Grouping operator
Array access
Member access from a pointer
Member access from an object
Scoping operator
Post-increment
Post-decrement
(a + b) / 4;
array[4] = 2;
ptr->age = 34;
obj.age = 34;
Class::age = 2;
for( i = 0; i < 10; i++ ) ...
for( i = 10; i > 0; i-- ) ...
left to right
2 !
~
++
--
-
+
*
&
(type)
sizeof
Logical negation
Bitwise complement
Pre-increment
Pre-decrement
Unary minus
Unary plus
Dereference
Address of
Cast to a given type
Return size in bytes
if( !done ) ...
flags = ~flags;
for( i = 0; i < 10; ++i ) ...
for( i = 10; i > 0; --i ) ...
int i = -1;
int i = +1;
data = *ptr;
address = &obj;
int i = (int) floatNum;
int size = sizeof(floatNum);
right to left
3 ->*
.*
Member pointer selector
Member pointer selector
ptr->*var = 24;
obj.*var = 24;
left to right
4 *
/
%
Multiplication
Division
Modulus
int i = 2 * 4;
float f = 10 / 3;
int rem = 4 % 3;
left to right
5 +
-
Addition
Subtraction
int i = 2 + 3;
int i = 5 - 1;
left to right
6 <<
>>
Bitwise shift left
Bitwise shift right
int flags = 33 << 1;
int flags = 33 >> 1;
left to right
7 <
<=
>
>=
Comparison less-than
Comparison less-than-or-equal-to
Comparison greater-than
Comparison geater-than-or-equal-to
if( i < 42 ) ...
if( i <= 42 ) ...
if( i > 42 ) ...
if( i >= 42 ) ...
left to right
8 ==
!=
Comparison equal-to
Comparison not-equal-to
if( i == 42 ) ...
if( i != 42 ) ...
left to right
9 & Bitwise AND flags = flags & 42; left to right
10 ^ Bitwise exclusive OR flags = flags ^ 42; left to right
11 | Bitwise inclusive (normal) OR flags = flags | 42; left to right
12 && Logical AND if( conditionA && conditionB ) ... left to right
13 || Logical OR if( conditionA || conditionB ) ... left to right
14 ? : Ternary conditional (if-then-else) int i = (a > b) ? a : b; right to left
15 =
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
Assignment operator
Increment and assign
Decrement and assign
Multiply and assign
Divide and assign
Modulo and assign
Bitwise AND and assign
Bitwise exclusive OR and assign
Bitwise inclusive (normal) OR and assign
Bitwise shift left and assign
Bitwise shift right and assign
int a = b;
a += 3;
b -= 4;
a *= 5;
a /= 2;
a %= 3;
flags &= new_flags;
flags ^= new_flags;
flags |= new_flags;
flags <<= 2;
flags >>= 2;
right to left
16 , Sequential evaluation operator for( i = 0, j = 0; i < 10; i++, j++ ) ... left to right

posted @ 2014-07-31 22:29  IAmAProgrammer  阅读(1491)  评论(0编辑  收藏