Подтвердить что ты не робот

Оператор post increment java

Я не могу сделать головы или хвосты следующего кода из "java puzzlers" от joshua bloch.

public class Test22{
 public static void main(String args[]){
  int j=0;
  for(int i=0;i<100;i++){ 
    j=j++;
  }
  System.out.println(j); //prints 0

  int a=0,b=0;
  a=b++;
  System.out.println(a);
  System.out.println(b); //prints 1


 }
}

Я не могу получить ту часть, где j печатает 0. По словам автора,

j=j++

похож на

temp=j;
j=j+1;
j=temp;

Но

a=b++

делает b 1. Поэтому он должен был так оценивать,

a=b
b=b+1

Следуя той же логике, не следует

j=j++

оценивается как

j=j
j=j+1

Где температура здесь появляется? Любые объяснения будут высоко оценены. & Л; < Я ломаю голову над этим.;) → Спасибо заранее.

4b9b3361

Ответ 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 - это значение переменной до того, как новое значение будет равно хранится".

Ответ 2

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

a = b++;

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

j = j++;

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

Ответ 3

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

Он похож на:

temp=j;
j += 1; 
j=temp;     // take the old value of j.