2012-12-19 9 views
23

Eventuali duplicati:
Java += operatorPerché l'operatore di incremento Java consente operazioni di restringimento senza cast esplicito?

In Java, questo non è valido (non compila), come previsto:

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

Ma questo è perfettamente bene (?!)

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

Si tratta ovviamente di un'operazione di restringimento che può eventualmente superare l'intervallo int. Quindi perché il compilatore non si lamenta?

+1

Questa domanda invita discussione invece di una risposta netta. –

risposta

4

i += lng; operatore di assegnazione composto cast implicitamente.

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

DA JLS:

Un'espressione assegnazione composta del op modulo E1 = E2 è equivalente a = (T) ((E1) op (E2)) E1, dove T è il tipo di E1, ad eccezione del fatto che E1 viene valutato solo una volta.

+1

Quindi sembra, ma perché? Mi sembra di andare contro l'essenza della lingua. –

+0

@CristiDiaconescu, Questo cast implicito si verifica senza errori perché non è disponibile alcuna sintassi per renderlo esplicito. Per esempio non saresti in grado di '* = 1.5' un intero altrimenti. – Robert

14

Questa viene definita nella JLS #15.26.2:

Un assegnamento espressione composto della forma E1 op= E2 equivale a E1 = (T) ((E1) op (E2)), dove T è il tipo di E1, tranne che E1 viene valutata solo una volta.

In altre parole, i += lng esegue un cast implicitamente.

+0

non è geloso, ma ho detto la stessa dannata cosa nella mia risposta un minuto prima di te e non ho avuto ripetizioni ..: P – PermGenError

+2

@GanGnaMStYleOverFlowErroR Hai appena riformulato la domanda di OP.assylia è stato upvoted per fare riferimento al JLS. Al contrario di te, lo ha pubblicato nella ** prima ** revisione, ed è stato il primo a postarlo; avevi bisogno di circa 5 revisioni per arrivarci (e solo dopo aver visto le risposte degli altri). –

+0

@GanGnaMStYleOverFlowErroR Scusa per questo - ma di certo non ho intenzione di regalare i 3 cappelli che ho appena ricevuto ;-) – assylias

3

Il compilatore non si lamenta perché, secondo JLS §15.26.2. Compound Assignment Operators:

Un assegnamento espressione composto della forma E1 op= E2 equivale a E1 = (T) ((E1) op (E2)), dove T è il tipo di E1, tranne che E1 viene valutata solo una volta.

Così,

i += lng; 

è equivalente a

i = (int)(i + lng); 
Problemi correlati