2012-12-19 9 views
23

Powiel możliwe:
Java += operatorDlaczego operator inkrementacji Java pozwala na zawężanie operacji bez jawnego rzutowania?

W Javie, to nie jest ważne (nie skompilować), zgodnie z oczekiwaniami:

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

Ale to jest w porządku (?!)

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

Jest to oczywiście operacja zwężania, która może prawdopodobnie przekroczyć zakres int. Dlaczego więc kompilator nie narzeka?

+1

To pytanie zachęca do dyskusji zamiast jednoznacznej odpowiedzi. –

Odpowiedz

4

i += lng; Operator przypisania złożenia działa w sposób dorozumiany.

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

Z JLS:

Wyrażenie zadanie związku o op postać E1 = E2 równoważne E1 = (T) ((E1) OP (E2)), gdzie T jest typ E1, z tym wyjątkiem, że E1 jest oceniany tylko jeden raz.

+1

Wygląda na to, ale dlaczego? Wydaje mi się, że jestem przeciwny sednie tego języka. –

+0

@CristiDiaconescu, Ten niejawny rzut odbywa się bez błędów, ponieważ nie ma żadnej składni, aby było to wyraźne. Na przykład w przeciwnym razie nie można by uzyskać wartości "* = 1,5". – Robert

14

to określono w JLS #15.26.2:

Związek przyporządkowanie ekspresja postaci E1 op= E2 odpowiada E1 = (T) ((E1) op (E2)), gdzie T jest typu E1 tym wyjątkiem, że E1 jest obliczane tylko raz.

Innymi słowy, i += lng wykonuje niejawnie rzutowanie.

+0

nie jest galaretowaty, ale powiedziałem tę samą rzecz w mojej odpowiedzi na chwilę przed tobą i nie dostałem żadnych powtórzeń ..: P – PermGenError

+2

@GanGnaMStYleOverFlowErroR Właśnie przeformułowałeś pytanie OP.assylias został przegłosowany za odniesienie do JLS. W przeciwieństwie do ciebie, opublikował to w ** pierwszej wersji i był pierwszym, który go opublikował; potrzebne było około 5 poprawek, aby się tam dostać (i tylko po zobaczeniu odpowiedzi innych). –

+0

@GanGnaMStYleOverFlowErroR Niestety, ale na pewno nie oddam 3 kapeluszy, które właśnie dostałem ;-) – assylias

3

Kompilator nie skarży się, ponieważ według JLS §15.26.2. Compound Assignment Operators:

Związek przyporządkowanie ekspresja postaci E1 op= E2 odpowiada E1 = (T) ((E1) op (E2)), gdzie T jest typu E1 tym wyjątkiem, że E1 jest obliczane tylko raz.

Zatem

i += lng; 

jest równoważna

i = (int)(i + lng); 
Powiązane problemy