2012-12-19 4 views
23

可能性の重複:(なぜJavaインクリメント演算子は明示的キャストなしで絞り込み操作を許可しますか?

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

しかし、これは完全に罰金です:Javaでは
Java += operator

、予想通りこれは、(コンパイルされません)有効ではありません?!)

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

これは明らかに絞り込み操作で、intの範囲を超える可能性があります。だから、コンパイラはなぜ不平を言っていないのですか?

+1

と同等です。 –

答えて

4

i += lng;キャストが暗黙的にキャストしています。 JLS FROM

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

E2はTであるE1 =(T)((E1)OP(E2))、に 等価である=フォームE1 OPの化合物の代入式E1 が1回だけ評価される点を除いて、E1タイプです。

+1

そうだが、なぜですか?私は言語の要点に逆らっているようです。 –

+0

@CristiDiaconescuこの暗黙のキャストは、明示的にするための構文がないため、エラーなしで行われます。例えば、そうでなければ '* = 1.5'を整数にすることはできません。 – Robert

14

これはJLS #15.26.2に定義されている:

形態E1 op= E2の複合代入式はTは一度だけ評価されるE1除き、E1のタイプであるE1 = (T) ((E1) op (E2))、と等価です。

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

+0

jelousではありませんが、私は私の答えで分かったことはあなたと私は担当者を持っていません..:P – PermGenError

+2

@GanGnaMStYleOverFlowErroRあなたはちょうどOPの質問を改めました。JLSを参照するためにassiliasがupvotedになった。あなたとは対照的に、彼は**最初の**リビジョンに投稿し、それを投稿する最初の人でした。そこに着くために約5つのリビジョンが必要でした(他人の答えを見た後でのみ)。 –

+0

@GanGnaMStYleOverFlowErroR申し訳ありませんが、私はちょうど私が持っている3つの帽子をあきらめるつもりはありません;-) – assylias

3

コンパイラはJLS §15.26.2. Compound Assignment Operatorsによれば、ので文句ない:

形態E1 op= E2の複合代入式はTE1が一度だけ評価されることを除いて、E1のタイプであり、E1 = (T) ((E1) op (E2))と等価です。

したがって、

i += lng; 

はこの質問ではなく、明確な答えの議論を招い

i = (int)(i + lng); 
関連する問題