2012-02-07 2 views

ответ

11

Разница связана с порядком операций. Следующее:

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

эквивалентно:

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

С другой стороны, следующие:

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

эквивалентно:

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

Обратите внимание на разницу при размещении скобок.

Теперь давайте рассмотрим два случая:

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

Здесь 97 + 2 оценивается первым. Результатом является int (99), который преобразуется в строку и добавляется к str. Результат: "Hello99".

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

Здесь (char)97 ('a') добавляется к строке, а затем 2 преобразуется в строку и добавляется к результату. Это дает "Helloa2".

2

Это все о ассоциативности операторов.

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

бы перевести:

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

Ваша первая линия эквивалентна:

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

в то время как ваш второй один эквивалентно:

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

, потому что сначала это оператор «+» строка используется как строки CONCAT (другие значения преобразуются в строки)

str +=((char)97)+2 

первая правая часть оцениваются до 99 (два байта суммы), чем СИЛЫ + 99 -> строка concat

5

Да. Соответствующий раздел JLS находится здесь: http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

Во время выполнения выражение оценивается одним из двух способов.Если выражение операнда левая не является выражением доступа к массиву, затем четыре шага необходимы:

  • Во-первых, левый операнд вычисляется, чтобы произвести переменную. Если эта оценка завершается внезапно, то выражение назначения завершается внезапно по той же причине; правый правый операнд не оценивается и не выполняется присвоение.
  • В противном случае значение левого операнда сохраняется, а затем оценивается правый операнд. Если эта оценка завершает внезапно, тогда выражение присваивания внезапно завершается для той же причины и не происходит никакого присвоения.
  • В противном случае, сохраненное значение переменных слева руки и значение правого операнда используются для выполнения бинарной операции, указанного оператором соединения назначения. Если эта операция завершается внезапно (единственная возможность - целочисленное деление на ноль - см. §15.16.2), то выражение назначения завершается внезапно по той же причине, и не происходит назначения .
  • В противном случае результатом двоичной операции является , преобразованный в тип левой переменной, и результат преобразования хранится в переменной.

(Выделено мною.)

Смежные вопросы