Ответ 1
Разбейте свой собственный аргумент:
По словам автора,
j=j++;
похож на
temp=j; j=j+1; // increment j=temp; // then assign
Да, вы правы до сих пор... но здесь, где вы ошибаетесь:
Но
a=b++;
делает
b=1
. Поэтому он должен был так оценивать,a=b; // assign b=b+1; // then increment
НЕПРАВИЛЬНО! Вы не применяете правило последовательно! Вы изменили порядок от приращения, а затем назначили для назначения затем прирост!!! Он действительно оценивался следующим образом:
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 Оператор приращения Postfix
"... значение 1 добавляется к значению переменной, а сумма сохраняется обратно в переменную [...] Значение выражения приращения postfix - это значение переменной до того, как новое значение будет равно хранится".