составной оператор присваивания java и оператор присваивания



У меня есть некоторые проблемы с пониманием составного оператора присваивания и оператора присваивания в java. Может ли кто-нибудь объяснить мне, как эти два оператора на самом деле работают? (Где-то я нашел действительно хороший пример кода, использующего временные переменные для объяснения работы, но, к сожалению, я его потерял.) Большое вам спасибо в пользу. Вот мой маленький пример кода для них (я уже знаю разницу между префиксными и постфиксными операторами):



       int k = 12;
k += k++;
System.out.println(k); // 24 -- why not (12+12)++ == 25?

k = 12;
k += ++k;
System.out.println(k); // 25 -- why not (1+12)+(1+12) == 26?

k = 12;
k = k + k++;
System.out.println(k); // 24 -- why not 25? (12+12)++?

k = 12;
k = k++ + k;
System.out.println(k); // 25 -- why not 24 like the previous one?

k = 12;
k = k + ++k;
System.out.println(k); // 25 -- OK 12+(1+12)

k = 12;
k = ++k + k;
System.out.println(k); // 26 -- why?
647   3  

3 ответов:

Обратите внимание, что во всех случаях присвоение k перезаписывает любое приращение, которое может произойти с правой стороны.

Размещение комментариев в строке:

   int k = 12;
   k += k++;   
   System.out.println(k);  // 24

k++ означает инкремент после вы использовали значение, так что это то же самое, что кодирование k = 12 + 12

   k = 12;
   k += ++k; 
   System.out.println(k); // 25

++k означает инкремент перед вы используете значение, так что это то же самое, что кодирование k = 12 + 13

   k = 12;
   k = k + k++; 
   System.out.println(k); // 24

k++ означает инкремент после вы использовали значение, так что это это то же самое, что кодирование k = 12 + 12

   k = 12;
   k = k++ + k; 
   System.out.println(k); // 25

k++ означает инкремент после вы использовали значение, так что это то же самое, что кодирование k = 12 + 13

   k = 12;
   k = k + ++k; 
   System.out.println(k); // 25

++k означает инкремент перед вы используете значение, так что это то же самое, что кодирование k = 12 + 13

   k = 12;
   k = ++k + k; 
   System.out.println(k); // 26

++k означает приращение перед вы используете значение, которое затем используется снова, так что это то же самое, что кодирование k = 13 + 13

Вот подробное объяснение первого случая:

int k = 12; k += k++; System.out.println(k);

k += k++; эквивалентно: k = k + (k++);

k + (k++); оценивается слева направо.
Первый k имеет значение 12. k++ вычисляется до исходного значения k (т. е. 12); k затем увеличивается.

Другие сообщения делают хорошую работу, объясняя другие случаи.


Но вот интересный случай, который показывает оценку слева направо и пост-инкрементацию на справа:

int k = 12; k = k + k++ + k; System.out.println(k);

k + (k++) + k; оценивается слева направо.
Первый k имеет значение 12.
Второй k: k++ оценивается до исходного значения k (т. е. 12); k позже увеличивается.
Третий k: Теперь k имеет увеличенное значение 13 (так как оно идет после второго k).
Общий результат-37 (т. е. 12 + 12 + 13).

Небольшое завершение отсюда: http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment

Давайте внимательно посмотрим, что делает строка "i = i++;":

Вычисляется"i++". Значение "i++" - это значение i до того, как произойдет приращение. В рамках оценки "i++", i увеличивается на единицу. Теперь i имеет значение 1; Задание выполнено. i присваивается значение " i++", которое является значением i перед приращением-то есть, 0. То есть, "i = i++" грубо переводится в

int oldValue = i; 
i = i + 1;
i = oldValue; 
Другими словами, это распространенное заблуждение, что приращение происходит последним. Инкремент выполняется сразу же после вычисления выражения,и значение перед инкрементом запоминается для дальнейшего использования в том же операторе.

Comments

    Ничего не найдено.