постинкрементный оператор Java

Кажется, мы находимся в тупике. Как отметил Марио, удвоения управляются как двоичные, и нет возможности отформатировать двоичный файл как double , за исключением преобразования его в строку с DecimalFormat, которая больше не является двойной. Я объяснил это своему боссу, и он в порядке с решением взять необработанный двойник, поэтому я закрываю эту проблему. Спасибо всем за вашу помощь и поддержку.

привет, Майк

13
задан Davis Herring 6 January 2018 в 03:21
поделиться

3 ответа

Оператор пост-инкремента неявно использует временную переменную. Это позволяет ему возвращать одно значение при установке другого аргумента. Вот почему

a = b++;

может увеличивать b , но устанавливать a на старое значение из b . То же самое происходит с

j = j++;

. Переменная увеличивается с правой стороны, но затем возвращается к старому значению, когда происходит присваивание.

12
ответ дан 1 December 2019 в 18:12
поделиться

Давайте разберем ваш собственный аргумент:

По словам автора,

j=j++;

аналогично

temp=j;
j=j+1; // инкремент
j=temp; // затем присваиваем

Да, пока что вы правы..., но вот где вы ошиблись:

Но

a=b++;

makes b=1. Так что это должно было быть оценено следующим образом,

a=b; // присваиваем
b=b+1; // затем увеличить

НЕПРАВИЛЬНО! Вы не применяете правило последовательно! Вы изменили порядок с увеличить, затем присвоить на присвоить, затем увеличить!!! На самом деле это оценивается так:

temp=b;
b=b+1;     // increment
a=temp;    // then assign

В основном присваивания такой формы:

lhs = rhs++;

похожи на выполнение чего-то вроде этого:

temp = rhs;
rhs = rhs+1;  // increment
lhs = temp;   // then assign

Примените это к a = b++;. Затем примените его также к j = j++;. Вот почему вы получаете такие результаты.

Что вы сделали, так это придумали свою собственную интерпретацию того, что делает a = b++; - НЕПРАВИЛЬНУЮ интерпретацию, которая не следует вышеприведенному правилу. Это и есть источник вашей путаницы.


См. также

  • JLS 15.14.2 Оператор постфиксного инкремента

    "...значение 1 прибавляется к значению переменной, и сумма сохраняется обратно в переменную [...] Значением выражения постфиксного инкремента является значение переменной до сохранения нового значения."

29
ответ дан 1 December 2019 в 18:12
поделиться

j++ будет использовать старое значение j, а затем увеличит его. Но когда он перезаписывает левую часть, он будет использовать старое значение j.

Это похоже на :

temp=j;
j += 1; 
j=temp;     // take the old value of j.
1
ответ дан 1 December 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: