составной оператор присваивания 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?
3 ответов:
Обратите внимание, что во всех случаях присвоение k перезаписывает любое приращение, которое может произойти с правой стороны.
Размещение комментариев в строке:
int k = 12; k += k++; System.out.println(k); // 24
k++означает инкремент после вы использовали значение, так что это то же самое, что кодированиеk = 12 + 12k = 12; k += ++k; System.out.println(k); // 25
++kозначает инкремент перед вы используете значение, так что это то же самое, что кодированиеk = 12 + 13k = 12; k = k + k++; System.out.println(k); // 24
k++означает инкремент после вы использовали значение, так что это это то же самое, что кодированиеk = 12 + 12k = 12; k = k++ + k; System.out.println(k); // 25
k++означает инкремент после вы использовали значение, так что это то же самое, что кодированиеk = 12 + 13k = 12; k = k + ++k; System.out.println(k); // 25
++kозначает инкремент перед вы используете значение, так что это то же самое, что кодированиеk = 12 + 13k = 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