Кажется, мы находимся в тупике. Как отметил Марио, удвоения управляются как двоичные, и нет возможности отформатировать двоичный файл как double , за исключением преобразования его в строку с DecimalFormat, которая больше не является двойной. Я объяснил это своему боссу, и он в порядке с решением взять необработанный двойник, поэтому я закрываю эту проблему. Спасибо всем за вашу помощь и поддержку.
привет, Майк
Оператор пост-инкремента неявно использует временную переменную. Это позволяет ему возвращать одно значение при установке другого аргумента. Вот почему
a = b++;
может увеличивать b
, но устанавливать a
на старое значение из b
. То же самое происходит с
j = j++;
. Переменная увеличивается с правой стороны, но затем возвращается к старому значению, когда происходит присваивание.
Давайте разберем ваш собственный аргумент:
По словам автора,
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++;
- НЕПРАВИЛЬНУЮ интерпретацию, которая не следует вышеприведенному правилу. Это и есть источник вашей путаницы.
"...значение 1 прибавляется к значению переменной, и сумма сохраняется обратно в переменную [...] Значением выражения постфиксного инкремента является значение переменной до сохранения нового значения."
j++
будет использовать старое значение j
, а затем увеличит его. Но когда он перезаписывает левую часть, он будет использовать старое значение j.
Это похоже на :
temp=j;
j += 1;
j=temp; // take the old value of j.