2012-02-07 30 views
8

Puede alguien explicar esto a mí,extraño comportamiento de Java operador + =

String str = "Hello"; 

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

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

qué el operador += evaluar la derecha primero y luego se concatenarlo con el lado izquierdo?

Respuesta

11

La diferencia tiene que ver con el orden de las operaciones. Los siguientes:

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

es equivalente a:

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

Por otra parte, lo siguiente:

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

es equivalente a:

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

Nota la diferencia en la colocación de paréntesis

Ahora vamos a considerar los dos casos:

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

Aquí, 97 + 2 se evalúa primero. El resultado es int (99), que se convierte en cadena y se agrega al str. El resultado es "Hello99".

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

Aquí, (char)97 ('a') se adjunta a la cadena, y luego 2 se convierte en cadena y se añade al resultado. Esto da "Helloa2".

2

Esto es todo acerca de la asociatividad del operador.

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

se traduciría en:

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

Su primera línea es equivalente a:

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

mientras el segundo es equivalente a:

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

porque primero es la cadena '+' del operador se utiliza como concat cadena (otros valores se convierten en cadena)

str +=((char)97)+2 

primer lado derecho se resuelve a 99 (dos suma de bytes) que es str + 99 -> string concat

5

Sí. La sección correspondiente del JLS está aquí: http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

En tiempo de ejecución, la expresión se evalúa de una de dos maneras.Si la expresión operando izquierda no es una expresión de acceso a conjunto, se requieren entonces de cuatro pasos:

  • primer lugar, el operando de la izquierda se evalúa a producen una variable. Si esta evaluación finaliza abruptamente, la expresión de asignación finaliza abruptamente por la misma razón; el operando de la derecha no se evalúa y no se realiza ninguna asignación.
  • De lo contrario, se guarda el valor del operando de la izquierda y luego el operando de la derecha se evalúa. Si esta evaluación completa abruptamente, la expresión de asignación se completa abruptamente para el mismo motivo y no se produce ninguna asignación.
  • De lo contrario, el valor guardado de la variable de la izquierda y el valor del operando de la derecha se utilizan para realizar la operación binaria se indica por el compuesto operador de asignación. Si esta operación finaliza abruptamente (la única posibilidad es una división entera por cero, consulte §15.16.2), la expresión de asignación finaliza abruptamente por el mismo motivo y no se produce la asignación .
  • De lo contrario, el resultado de la operación binaria es convertido al tipo de la variable de la izquierda y el resultado de la conversión se almacena en la variable.

(Énfasis por mí.)