i++
- это постфиксное приращение - оно увеличивает i, то по существу возвращает старое значение i. Оператор эквивалентных префиксов, ++i
, вернет «обновленное» значение, но это не то, что используется здесь.
i+=2
работает по-разному, однако, это по существу эквивалентно i+2
, так как делает возвращает обновленное значение.
Однако, я думаю, где возникает путаница в том, что вы смотрите на это так:
i = (i += 2) + i++;
... который делает дать свой ожидаемый результат. i+=2
дает 4, и обновляет i
до 4, затем i++
возвращает 4 (вместо 5, так как это пост инкремент.) Тем не менее, если принять оператор приоритет в уравнение, Java на самом деле «скобки» это как это по умолчанию:
i = i += (2 + i++);
Просто чтобы прояснить путаницу, Java оценивает это так, потому что +=
оператор has least precedence in this example, и поэтому выражение сложения (+
) вычисляется первым.
Это квадратные скобки утверждение по существу эквивалентно:
i = (i = i + (2 + i++));
Который в свою очередь, упрощает для:
i = i + (2 + i++);
Поэтому, учитывая приведенное выше утверждение, и оценки слева направо, первый взять значение i (2), а затем добавить к нему значение 2+i++
; последний дает 4 (из-за приращения постфикса). Таким образом, наш окончательный результат равен 2 + 4, что равно 0.
Это неопределенное поведение в C/C++. По уважительной причине. Вы не должны этого делать. –
@JanDvorak Конечно, но в Java это * определено *, и пока вы не должны делать это на практике, это интересный академический вопрос. – berry120
@ berry120: Спасибо за хорошо объясненное объяснение сэра Берри. :) –