是:
x -= y;
相当于:
x = x - y;
不,它们不等同于您表达它们的方式。
short x = 0, y = 0;
x -= y; // This compiles fine!
x = x - y; // This doesn't compile!!!
// "Type mismatch: cannot convert from int to short"
第三行的问题是-
执行操作数的所谓“数字提升”(JLS 5.6)short
,并产生一个int
值,该值不能简单地分配给short
没有强制转换的 a 。复合赋值运算符包含一个隐藏的演员表!
JLS 15.26.2 复合赋值运算符中列出了确切的等价关系:
E1 op= E2形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)),其中T是E1的类型,除了E1只计算一次。
因此,为了澄清一些微妙之处:
int x = 5; x *= 2 + 1; // x == 15, not 11
int i = 0; i += 3.14159; // this compiles fine!
arr[i++] += 5; // this only increments i once
Java 也有*=
, /=
, %=
, +=
, -=
, <<=
, >>=
, >>>=
, &=
,^=
和|=
. 最后 3 个也是为布尔值定义的(JLS 15.22.2 布尔逻辑运算符)。
是的。这种语法在大多数 C 派生语言中是相同的。
不完全是。在 C 中引入它的原因是允许程序员进行一些编译器无法进行的优化。例如:
A[i] += 4
以前编译得比
A[i] = A[i] + 4
由当时的编译器。
而且,如果“x”有副作用,例如“x++”,那么它就完全不同了。