这类运算的特点是:参与运算的量既是运算分量,又是存储对象。为避免对同一存储对象的地址重复计算,提高编译效率,Java引入复合赋值运算符。凡是双目运算符都可以与赋值运算符组合成复合赋值运算符。Java提供了11种复合赋值运算符。表3.7总结了复合赋值运算的用法,如下:
表3.7 复合赋值运算
运算符 |
用法 |
等价于 |
+= |
exp1+=exp2 |
exp1= exp1+exp2 |
-= |
exp1-=exp2 |
exp1= exp1-exp2 |
*= |
exp1*=exp2 |
exp1= exp1*exp2 |
/= |
exp1/=exp2 |
exp1= exp1/exp2 |
%= |
exp1%=exp2 |
exp1= exp1%exp2 |
&= |
exp1&=exp2 |
exp1= exp1&exp2 |
|= |
exp1|=exp2 |
exp1= exp1|exp2 |
^= |
exp1^=exp2 |
exp1= exp1^exp2 |
<<= |
exp1<<=exp2 |
exp1= exp1<<exp2 |
>>= |
exp1>>=exp2 |
exp1= exp1>>exp2 |
>>>= |
exp1>>>=exp2 |
exp1= exp1>>>exp2 |
优先级和结合性
Java运算符是有严格的优先级的,它和代数运算中的先乘除后加减一样,按优先级从高到低的顺序。在一段程序代码中可能存在着各种运算符,Java语言中规定了出现各种运算符的时候,哪种运算符先被执行,哪种运算符后被执行,这种运算顺序称为优先级。优先级别高的运算符先进行运算。下面表3.8按从高到底的顺序列出了运算符的优先级。
表3.8 算符的优先级
运算符 |
优先级 |
. []…() |
1 |
++ -- ! ~ instanceiof |
2 |
new (type) |
3 |
* / % |
4 |
+ - |
5 |
<< >> >>> |
6 |
< > <= >= |
7 |
== != |
8 |
& |
9 |
^ |
10 |
| |
11 |
&& |
12 |
|| |
13 |
?: |
14 |
= += -= *= /= %= ^= &= |= <<= >>= >>>= |
15 |
在同一个表达式中出现多个相同优先级的运算符时,就需要考虑结合性。它分为左结合性和右结合性。左结合性指的就是从左向右进行运算。右结合性则反之。表3.9列出了运算符的结合性列表。
3.9 运算符的结合性
运算符 |
操作数 |
结合性 |
+ - ++ -- |
一元运算符 |
右结合性 |
+ - * / % < > <= >= == != && || ! |
二元运算符 |
左结合性 |
=(赋值运算符) |
二元运算符 |
右结合性 |
?: |
三元运算符 |
右结合性 |