Почему постфиксные операторы в Java оцениваются справа налево?

1

Предположим, что в Java есть следующий фрагмент кода:

int a = 3;
int b = a++;

Значение a сначала присваивается b а затем увеличивается. b = 3 и a = 4. Тогда почему выражение postfix оценивается справа налево? Разве не имеет смысла оценивать его слева направо?

  • 0
    Как троичный оператор оценивается справа налево? Конечно, для a?b:c порядок оценки равен a или b или c , в зависимости от значения a .
  • 0
    Порядок оценки применяется только в том случае, если есть несколько вещей для оценки. Ваш пример этого не делает.
Теги:
operator-precedence

3 ответа

0
Лучший ответ

Кажется, здесь какая-то путаница. Java всегда оценивает слева направо (или, точнее, всегда делает вид, что делает это), как указано в JLS здесь:

Язык программирования Java гарантирует, что операнды операторов, по-видимому, оцениваются в определенном порядке оценки, а именно слева направо.

То, о чем вы говорите, - это направление ассоциативности, то есть если операнд зажат между двумя операциями с одинаковым приоритетом, с которым связан операнд. Таким образом, троичный оператор, например, связан с правами, потому что, если у вас есть a?b?c:d:e, вы ожидаете, что он решит проблему a?(b?c:d):e

Но постфикс ++, на том же уровне приоритета, что и '.' оператор связан слева направо, поэтому foo.bar++ работает.

Префикс ++ действительно является правильной группировкой, потому что ++++x должен действительно быть "++ (++x). Так как это унарный оператор и операнд справа, он должен группироваться вправо.

2

Операторы postfix не оцениваются справа налево; их побочный эффект происходит после определения значения (грубо говоря - JLS указывает порядок).

  • 0
    Я читаю OCA Java SE 7 Associate Study Guide. В главе 3 книги четко сказано, что операторы постфиксного увеличения и удаления оцениваются справа налево. Я также подтвердил то же самое из cseweb.ucsd.edu/~ricko/CSE8A/Java_Operator_Precedence_Table.pdf.
  • 1
    Это ассоциативность, а не порядок оценки.
Показать ещё 2 комментария
0

На самом деле: Нет. Это ожидаемое поведение. Сравните a++ с ++a. Если вы сделаете последнее, вы получите a = 4, b = 4.

  • 0
    Что ж, имеет смысл, чтобы префиксные операторы оценивались справа налево. Обновите сначала, а затем б. Но в постфиксных операторах b обновляется раньше, чем a. Так что имеет больше смысла читать его слева направо ... по крайней мере, для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню