Предположим, что в Java есть следующий фрагмент кода:
int a = 3;
int b = a++;
Значение a
сначала присваивается b
а затем увеличивается. b = 3
и a = 4
. Тогда почему выражение postfix оценивается справа налево? Разве не имеет смысла оценивать его слева направо?
Кажется, здесь какая-то путаница. Java всегда оценивает слева направо (или, точнее, всегда делает вид, что делает это), как указано в JLS здесь:
Язык программирования Java гарантирует, что операнды операторов, по-видимому, оцениваются в определенном порядке оценки, а именно слева направо.
То, о чем вы говорите, - это направление ассоциативности, то есть если операнд зажат между двумя операциями с одинаковым приоритетом, с которым связан операнд. Таким образом, троичный оператор, например, связан с правами, потому что, если у вас есть a?b?c:d:e
, вы ожидаете, что он решит проблему a?(b?c:d):e
Но постфикс ++
, на том же уровне приоритета, что и '.' оператор связан слева направо, поэтому foo.bar++
работает.
Префикс ++
действительно является правильной группировкой, потому что ++++x
должен действительно быть "++ (++x). Так как это унарный оператор и операнд справа, он должен группироваться вправо.
Операторы postfix не оцениваются справа налево; их побочный эффект происходит после определения значения (грубо говоря - JLS указывает порядок).
На самом деле: Нет. Это ожидаемое поведение. Сравните a++
с ++a
. Если вы сделаете последнее, вы получите a = 4, b = 4.
a?b:c
порядок оценки равенa
илиb
илиc
, в зависимости от значенияa
.