### 结合性与优先级

运算符具有结合性和优先级两个属性，这两个属性描述的语句的执行顺序。所谓结合性是指表达式的整体计算方向，即从左向右或从右向左。以“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++运算符的优先级和结合性。

表 1 C++运算符优先级和结合性

运算符 | 描述 | 优先级 | 结合性
() | 圆括号 | 1 | 从左向右
[] | 下标符号
-> | 对象或结构体指针运算符
. | 对象或结构体对象运算符
! | 逻辑非运算 | 2 | 从右向左
~ | 按位取反运算符
++ | 自增运算符
-- | 自减运算符
- | 负号运算符
* | 指针运算符
& | 取地址运算符
sizeof | 长度运算符
* | 乘法运算符 | 3 | 从左向右
/ | 除法运算符
% | 求余运算符
+ | 加法运算符 | 4 | 从左向右
- | 减法运算符
<< | 左移运算符 | 5 | 从左向右
>> | 右移运算符
< | 关系运算符 大于 | 6 | 从左向右
<= | 关系运算符 大于等于
> | 关系运算符 小于
>= | 关系运算符 小于等于
== | 关系运算符 等于 | 7 | 从左向右
!= | 关系运算符 不等于
& | 按位与运算符 | 8 | 从左向右
^ | 按位异或运算符 | 9 | 从左向右
| | 按位或运算符 | 10 | 从左向右
&& | 逻辑与运算符 | 11 | 从左向右
|| | 逻辑或运算符 | 12 | 从左向右
? | 三目元条件运算符 | 13 | 从右向左
: | 三目元条件运算符
= | 赋值运算符 | 14 | 从左向右
+=
-=
*=
/=
%=
>>=
<<=
&=
^=
|=
, | 逗号运算符 | 15 | 从左向右

说明：在同一个表达式中，同一优先级的运算符，运算次序由结合性决定。