8

は:

x -= y;

に相当:

x = x - y;
4

3 に答える 3

37

いいえ、それらはあなたがそれらを表現した方法と同等ではありません。

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)を実行し、キャストなしで単純に割り当てることができない値を生成することです。複合代入演算子には隠しキャストが含まれています!shortintshort

正確な同等性は、JLS15.26.2複合代入演算子に示されています。

E1 op = E2の形式の複合代入式は、E1 =(T)((E1)op(E2))と同等です。ここで、TE1のタイプですが、E1は1回だけ評価されます。

したがって、いくつかの微妙な点を明確にするために:

  • 複合代入式はオペランドを並べ替えません
    • 左側は左側に留まり、右側は右側に留まります
  • 両方のオペランドは完全に括弧で囲まれており、 opの優先順位が最も低くなります。
    • 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ブール論理演算子)に対しても定義されています。-=<<=>>=>>>=&=^=|=

関連する質問

于 2010-03-10T04:38:23.927 に答える
5

はい、そうです。この構文は、ほとんどのC派生言語で同じです。

于 2010-03-10T04:33:02.183 に答える
2

ではない正確に。Cで導入された理由は、プログラマーがコンパイラーでは不可能だったいくつかの最適化を行えるようにするためでした。例えば:

A[i] += 4

以前よりもはるかによくコンパイルされていました

A[i] = A[i] + 4

当時のコンパイラによって。

また、「x」に「x ++」などの副作用がある場合は、大きく異なります。

于 2010-03-10T04:39:12.893 に答える