这类运算的特点是:参与运算的量既是运算分量,又是存储对象。为避免对同一存储对象的地址重复计算,提高编译效率,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 运算符的结合性
运算符 | 操作数 | 结合性 |
+ - ++ -- | 一元运算符 | 右结合性 |
+ - * / % < > <= >= == != && || ! | 二元运算符 | 左结合性 |
=(赋值运算符) | 二元运算符 | 右结合性 |
?: | 三元运算符 | 右结合性 |