结合性与优先级
运算符具有结合性和优先级两个属性,这两个属性描述的语句的执行顺序。所谓结合性是指表达式的整体计算方向,即从左向右或从右向左。以“int iret = x + y + z;”语句为例,由于算术运算符的结合性从左向右,即表达式的整体计算方向从左向右。因此语句中“x + y + z”的计算方式首先计算“x + y”,然后结果再与“z”相加。而赋值运算符的计算方向是从右向左,即将右边的结果赋值给左边,因此将“x + y + z”的结果赋值为iret,而不是将iret赋值给“x + y +z”。优先级表示的是运算符的优先执行顺序。在数学中表达式“x + y * z”的计算方式是先计算“y * z”,然后将结果与“x”相加。在计算机中,为了符合人们的计算习惯,同样规定了*运算符的优先级高于+运算符,因此,表达式“x + y * z”在程序中的执行顺序与在人们在数学中的计算方式是相同的。表1描述了C++运算符的优先级和结合性。
表1C++运算符优先级和结合性
|
运算符
|
描述
|
优先级
|
结合性
|
|
()
|
圆括号
|
1
|
从左向右
|
|
[]
|
下标符号
|
|
->
|
对象或结构体指针运算符
|
|
.
|
对象或结构体对象运算符
|
|
!
|
逻辑非运算
|
2
|
从右向左
|
|
~
|
按位取反运算符
|
|
++
|
自增运算符
|
|
--
|
自减运算符
|
|
-
|
负号运算符
|
|
*
|
指针运算符
|
|
&
|
取地址运算符
|
|
sizeof
|
长度运算符
|
|
*
|
乘法运算符
|
3
|
从左向右
|
|
/
|
除法运算符
|
|
%
|
求余运算符
|
|
+
|
加法运算符
|
4
|
从左向右
|
|
-
|
减法运算符
|
|
<<
|
左移运算符
|
5
|
从左向右
|
|
>>
|
右移运算符
|
|
<
|
关系运算符 大于
|
6
|
从左向右
|
|
<=
|
关系运算符 大于等于
|
|
>
|
关系运算符 小于
|
|
>=
|
关系运算符 小于等于
|
|
==
|
关系运算符 等于
|
7
|
从左向右
|
|
!=
|
关系运算符 不等于
|
|
&
|
按位与运算符
|
8
|
从左向右
|
|
^
|
按位异或运算符
|
9
|
从左向右
|
|
|
|
按位或运算符
|
10
|
从左向右
|
|
&&
|
逻辑与运算符
|
11
|
从左向右
|
|
||
|
逻辑或运算符
|
12
|
从左向右
|
|
?
|
三目元条件运算符
|
13
|
从右向左
|
|
:
|
三目元条件运算符
|
|
=
|
赋值运算符
|
14
|
从左向右
|
|
+=
|
|
-=
|
|
*=
|
|
/=
|
|
%=
|
|
>>=
|
|
<<=
|
|
&=
|
|
^=
|
|
|=
|
|
,
|
逗号运算符
|
15
|
从左向右
|
说明:在同一个表达式中,同一优先级的运算符,运算次序由结合性决定。