Давайте разберем ваш собственный аргумент:
По мнению автора,
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 Оператор постфиксного приращения
"... значение 1 добавляется к значению переменной, а сумма сохраняется обратно в переменную [...] Значением выражения приращения постфикса является значение переменной перед новое значение сохранено. "