2012-02-07 31 views
8

qualcuno può spiegare questo a me,strano comportamento Java operatore + =

String str = "Hello"; 

str += ((char)97) +2; // str = "Hello99"; 

str = str +((char)97)+2; // str = "Helloa2"; 

fa l'operatore += valutare il lato destro prima poi concatenare con il lato sinistro?

risposta

11

La differenza ha a che fare con l'ordine delle operazioni. Il seguente:

str += ((char)97) +2; 

è equivalente a:

str = str + (((char)97) + 2); 

D'altra parte, la seguente:

str = str +((char)97)+2; 

è equivalente a:

str = (str + ((char)97)) + 2; 

Nota la differenza nel posizionamento delle parentesi.

Consideriamo ora i due casi:

1) str = str + (((char)97) + 2):

Qui, 97 + 2 viene valutata per prima. Il risultato è un int (99), che viene convertito in stringa e aggiunto a str. Il risultato è "Hello99".

2) str = (str + ((char)97)) + 2:

Qui, (char)97 ('a') è allegato alla stringa, e quindi 2 viene convertito in stringa e allegato al risultato. Questo dà "Helloa2".

2

Tutto questo riguarda l'associatività dell'operatore.

str += ((char)97) +2; 

si tradurrebbe in:

str = str + (((char)97)+2); 
1

La prima linea è equivalente a:

str = str + ((char)97) + 2); 

in tutta secondo è equivalente a:

str = (str + ((char)97)) + 2 
1
str = str +((char)97)+2 

perché prima è stringa operatore '+' è usato come concat stringa (altri valori sono convertiti in stringa)

str +=((char)97)+2 

primo lato destro è valutata a 99 (due somma byte) che è str + 99 -> stringa concat

5

Sì. La sezione pertinente del JLS è qui: http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

In fase di esecuzione, l'espressione viene valutata in due modi.Se l'espressione operando sinistra non è un'espressione accesso matrice, devono poi quattro fasi:

  • Innanzitutto, l'operando sinistro è valutato per produrre una variabile. Se questa valutazione viene completata improvvisamente, l'espressione di assegnazione si completa improvvisamente per lo stesso motivo; l'operando di destra non viene valutato e non si verifica alcuna assegnazione.
  • In caso contrario, il valore dell'operando di sinistra viene salvato e quindi l'operando di destra viene valutato. Se questa valutazione completa improvvisamente , l'espressione di assegnazione viene completata improvvisamente per lo stesso e non si verifica alcuna assegnazione.
  • Altrimenti, il valore memorizzato della variabile sinistra e il valore dell'operando di destra vengono utilizzati per eseguire l'operazione binaria indicata dal composto assegnazione operatore. Se questa operazione viene completata improvvisamente (l'unica possibilità è una divisione intera per zero, vedere §15.16.2), quindi l'espressione di assegnazione si completa improvvisamente per lo stesso motivo e non si verifica l'assegnazione di .
  • In caso contrario, il risultato dell'operazione binaria è convertito nel tipo della variabile di sinistra e il risultato della conversione viene memorizzato nella variabile.

(enfasi da me.)