постинкрементный оператор java - PullRequest
13 голосов
/ 01 мая 2010

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

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

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

Ответы [ 3 ]

29 голосов
/ 01 мая 2010

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

По мнению автора,

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

12 голосов
/ 01 мая 2010

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

a = b++;

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

j = j++;

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

1 голос
/ 01 мая 2010

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

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

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