赋值运算符把值存储在某种变量中或赋予某种变量。左侧操作数必须是适当的局部变量、数组元素或对象字段。右侧操作数可以是与变量兼容的任何类型。赋值表达式的计算结果是赋予变量的值。不过,更重要的是,赋值表达式的副作用是执行赋值操作。和其他二元运算符不同的是,赋值运算符是右结合的,也就是说,赋值表达式 a=b=c 从右向左执行,即 a=(b=c)。
基本的赋值运算符是 =。别把它和相等运算符 == 搞混了。为了区别这两个运算符,我们建议你把 = 读作“被赋值为”。
除了这个简单的赋值运算符之外,Java 还定义了另外 11 个运算符,其中 5 个与算术运算符一起使用,6 个与位运算符和位移运算符一起使用。例如,+= 运算符先读取左侧变量的值,再和右侧操作数相加。这种表达式的副作用是把两数之和赋值给左侧变量,返回值也是两数之和。因此,表达式 x+=2 几乎和 x=x+2 一样。这两种表达式之间的区别是,+= 运算符只会计算一次左侧操作数。如果左侧操作数有副作用,这个区别就体现出来了。如下两个表达式并不等效:
a[i++] += 2;
a[i++] = a[i++] + 2;
组合赋值运算符的一般格式为:
var op= value
如果 var 没有副作用)等效于:
var = var op value
可用的组合赋值运算符有:
+= -= *= /= %= // 算术运算符加赋值运算符
&= |= ^= // 位运算符加赋值运算符
<<= >>= >>>= // 位移运算符加赋值运算符
其中,最常用的运算符是 += 和 -=,不过处理布尔值标志时,&= 和 |= 也有用。例如:
i += 2; // 循环计数器增加2
c -= 5; //计数器减小5
flags |= f; //在一组整数标志flags中设定f标志
flags &= ~f; // 在一组整数标志flags中清除f标志