Тернарный оператор в 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; учебное пособие просто плохо сформулировано.