(Потенциально странно) поведение с длинным шагом? - PullRequest
5 голосов
/ 06 февраля 2012

Я немного смущен, задавая этот вопрос, но результат следующего фрагмента кода поставил меня в тупик:

System.out.println("incrementResultResponses() has been invoked!");
final long oldValue = resultResponses;
final long newValue = resultResponses++;
System.out.println("Old value = " + oldValue);
System.out.println("New value = " + newValue);

Это выводит следующее:

incrementResultResponses() has been invoked!
Old value = 0
New value = 0

Почему? Будет ли параллелизм иметь какое-либо влияние на результат здесь? Кстати, resultResponses это long.

Ответы [ 4 ]

11 голосов
/ 06 февраля 2012

Оператор постфикса ++ возвращает значение old (до приращения).Вы хотите использовать префикс ++:

final long oldValue = resultResponses;
final long newValue = ++resultResponses;
3 голосов
/ 06 февраля 2012

Поскольку приращение увеличивает значение после , оно было присвоено ( Постинкремент ).Это именно то, что resultResponses++ должен делать.
Если вы хотите, чтобы resultResponses был равен 1, вам нужно использовать Pre-Increment , то есть ++resultResponses

2 голосов
/ 06 февраля 2012

Если вы хотите увеличить oldValue перед присваиванием, вам нужно будет поставить ++ перед переменной:

final long newValue = ++resultResponses;

Это означает, что приращение происходит до выполнения оператора, а не после.

1 голос
/ 01 февраля 2018

Обратитесь к этому , чтобы узнать, как работают postfix и prefix. Как уже упоминалось в ответах выше, вы можете использовать это:

final long oldValue = resultResponses;
final long newValue = ++resultResponses;

Или, если хотите, вы можете использовать:

final long oldValue = resultResponses++;
final long newValue = resultResponses;

, что также приведет к тому же выводу.

...