Тернарный оператор в 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?
2 ответов:
Я один из авторов книги, из которой это вышло. Хотя я не писал это конкретное предложение, я согласен, что намерение было "это было проверено на Java 7". Я сделаю заметку, чтобы удалить это, если мы напишем другое издание.
чтобы быть ясным, тернарный оператор вел себя таким же образом в Java 8, 7, 6 и т. д. И я был бы очень удивлен, если бы это изменилось в будущем.
с Java 6 JLS:
во время выполнения, первое выражение операнда условного сначала вычисляется выражение; при необходимости выполняется преобразование распаковки выполняется на результат; полученное логическое значение затем используется для выберите второе или третье выражение операнда:
- если значение первого операнда равно true, то второй операнд выражения выбирают.
- если значение первый операнд имеет значение false, затем выбирается выражение третьего операнда.
затем вычисляется выбранное выражение операнда и результат значение преобразуется в тип условного выражения определяется по правилам, изложенным выше. Это преобразование может включать в себя бокс (§5.1.7) или преобразования распаковывания. выражение операнда нет выбранный не оценивается для этой конкретной оценки условный выражение.
аналогичная формулировка также появляется в изданиях JLS, возвращающихся к 1.0. Поведение не изменилось в Java 7; учебное пособие просто плохо сформулировано.
Comments