сложный оператор присваивания java и оператор присваивания - PullRequest
3 голосов
/ 14 сентября 2011

У меня возникли проблемы с пониманием составного оператора присваивания и оператора присваивания в 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 ]

6 голосов
/ 14 сентября 2011

Обратите внимание, что во всех случаях присвоение 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

1 голос
/ 13 июня 2014

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

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).

0 голосов
/ 19 сентября 2011

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

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

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

int oldValue = i; 
i = i + 1;
i = oldValue; 

Другими словами, распространенным заблуждением является то, что приращение происходит последним. Приращение выполняется сразу после вычисления выражения, и значение перед приращением запоминается для будущего использования внутри того же оператора.

...