Тернарный оператор в Java, оценивающий только одно выражение после Java 7 - это было другим в Java 1.6 и ниже?

Готовясь к экзамену Oracle Certified Associate Java SE 8 Programmer 1, я наткнулся на следующий абзац о троичном выражении в официальном учебном пособии:

Оценка троичной экспрессии
Начиная с Java 7, только одно из правых выражений тернарного оператора будет оцениваться во время выполнения. Подобно операторам короткого замыкания, если одно из двух правых выражений в троичном операторе выполняет побочный эффект, то оно может не применяться во время выполнения. Давайте проиллюстрируем этот принцип на следующем примере: [...]

Он говорит, что оценивается только одно из двух выражений, демонстрируя на следующем примере:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

Здесь только y увеличивается, но z не так, как вы ожидаете.

На что я натыкаюсь - это начало абзаца (отмечено желтым цветом), где написано "Начиная с Java 7, ...". Я тестировал тот же код с Java 1.6, и я не могу найти разницу в поведении. Я ожидал, что Java 1.6 оценит оба выражения только на основании информации, приведенной в параграфе. У кого-нибудь есть идея, что они хотели сказать с "Начиная с Java 7, ..."?

Изменить: чтобы избежать путаницы: это сводится к вопросу, так как они пишут "Начиная с Java 7", было ли что-то, что изменилось в отношении троичного оператора, при переключении с Java 6 на Java 7?

2 ответа

Решение

Я один из авторов этой книги. Хотя я не писал это конкретное предложение, я согласен, что намерение было "это было проверено на Java 7". Я запишу это, если мы напишем другое издание.

Чтобы было ясно, троичный оператор вел себя так же в Java 8, 7, 6 и т. Д. И я был бы весьма удивлен, если он изменится в будущем.

Из Java 6 JLS:

Во время выполнения первое выражение операнда условного выражения вычисляется первым; при необходимости выполняется конвертирование без распаковки на результат; результирующее логическое значение затем используется для выбора второго или третьего выражения операнда:

  • Если значение первого операнда равно true, тогда выбирается выражение второго операнда.
  • Если значение первого операнда равно false, выбирается выражение третьего операнда.

Выбранное выражение операнда затем оценивается, и результирующее значение преобразуется в тип условного выражения, как определено правилами, указанными выше. Это преобразование может включать в себя бокс (§5.1.7) или распаковку конверсии. Не выбранное выражение операнда не оценивается для этой конкретной оценки условного выражения.

Аналогичная формулировка также появляется в версиях JLS, начиная с версии 1.0. Поведение не изменилось в Java 7; учебное пособие просто плохо сформулировано.

Другие вопросы по тегам