29

重複の可能性:
Java += 演算子

Java では、予想どおり、これは有効ではありません (コンパイルされません)。

long lng = 0xffffffffffffL;
int i;
i = 5 + lng;    //"error: possible loss of magnitude"

でもこれで全然平気(?!)

long lng = 0xffffffffffffL;
int i = 5;
i += lng;       //compiles just fine

これは明らかに縮小操作であり、範囲を超える可能性がありintます。では、なぜコンパイラは文句を言わないのでしょうか?

4

3 に答える 3

14

これはJLS #15.26.2で定義されています。

の形式の複合代入式は、E1 op= E2E1 = (T) ((E1) op (E2))T型ですがE1E1は 1 回だけ評価されます。

つまり、i += lngキャストを暗黙的に実行します。

于 2012-12-19T10:06:45.833 に答える
5

i += lng; 複合代入演算子のキャストは暗黙的に。

i+=lng; 
is same as 
i = int(i+lng);

JLSから

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

于 2012-12-19T10:05:37.060 に答える
3

The compiler does not complain because, according to JLS §15.26.2. Compound Assignment Operators:

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

Thus,

i += lng;

is equivalent to

i = (int)(i + lng);
于 2012-12-19T10:07:29.853 に答える