は:
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"
3行目の問題は、オペランドの-
いわゆる「数値昇格」(JLS 5.6)を実行し、キャストなしで単純に割り当てることができない値を生成することです。複合代入演算子には隠しキャストが含まれています!short
int
short
正確な同等性は、JLS15.26.2複合代入演算子に示されています。
E1 op = E2の形式の複合代入式は、E1 =(T)((E1)op(E2))と同等です。ここで、TはE1のタイプですが、E1は1回だけ評価されます。
したがって、いくつかの微妙な点を明確にするために:
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 ++」などの副作用がある場合は、大きく異なります。