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



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

548   2  

2 ответов:

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

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

с Java 6 JLS:

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

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

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

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

Comments

    Ничего не найдено.