Тернарный оператор в 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?

Ответ 1

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

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

Ответ 2

Из Java 6 JLS:

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

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

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

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