Термінальний оператор на Java оцінював лише один вираз з Java 7 - чи відрізнявся він у Java 1.6 і нижче?


109

Готуючись до іспиту 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?


4
Чому ви очікуєте, що z також буде збільшений? Це не має для мене сенсу.
Іржі Кантор

15
звучить як погано написана книга, потрійні оператори не змінилися з моменту створення
яви, афаїк

23
Читаючи більшість відповідей, розміщених до цих пір, люди, здається, неправильно трактують питання. Це не "Чому обидва вирази не оцінюються?", А скоріше "Чому ця книга, здавалося б, означає, що вона поводилася по-різному?"
BambooleanLogic

23
Насправді я бачив, що "Станом на дату / версію X" означало "Ми перевірили, що це правда на дату / у версії X, але про попередні версії ми нічого не говоримо". Я здогадуюсь, що тут може бути сенс. (Хоча ви думаєте, що було б досить просто перевірити більш ранні версії Java.) У будь-якому випадку це більше англійська проблема, ніж програмна.
David Z

14
@DavidZ: Проблеми з англійською мовою є проблемами програмування, коли вони не дозволяють вам виконати роботу. Цей неякісний коментар змусив ОП припинити те, що він робив, і витратити час на виявлення, що НІЧОГО НЕ ЗМІНЕНО. Програмування - це спілкування, до компілятора / перекладача та до того, хто піде разом, щоб підтримувати ваш код. Я не можу порахувати разів, коли я читав якийсь код, і мені довелося зупинитись через щось дивне, що / можливо / мало щось спільне з проблемою, лише щоб дізнатися, що це просто погано «сформульовано».
jmoreno

Відповіді:


92

Я один із авторів книги, з якої вона походила. Поки я не писав саме це речення, я погоджуюся з наміром "це було перевірено на Java 7". Я зроблю замітку, щоб зняти це, якщо ми напишемо інше видання.

Щоб було зрозуміло, потрійний оператор поводився так само в Java 8, 7, 6 і т. Д. І я був би дуже здивований, якби це змінилося в майбутньому.


116

З Java 6 JLS :

Під час виконання спочатку оцінюється перший операндний вираз умовного виразу; при необхідності конверсія розгорнуто на результат; отримане булеве значення потім використовується для вибору другого або третього виразу операнду:

  • Якщо значення першого операнда є істинним, то вибирається другий вираз операнда.
  • Якщо значення першого операнда хибне, вибирається вираз третього операнда.

Потім обраний вираз операнда оцінюється і отримане значення перетворюється у тип умовного виразу, як визначено правилами, зазначеними вище. Ця конверсія може включати бокс (§5.1.7) або конверсію для розпакування. Вибраний операнд, не обраний, не оцінюється для цієї конкретної оцінки умовного виразу.

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


2
Отже, відповідь - "Немає різниці, як у Java 7, так і раніше, стосовно термінального оператора", правда?
Матіас Бадер

5
Здається легітимним. Я написав записки авторам - з нетерпінням чекаю їхньої відповіді
Матіас Бадер

Можливо, ви також можете знайти URL-адресу, яка порівнює код оператора між версіями. Якщо ти параноїк / цікавий.
Стів Клей

7
Кількість погано написаних (або просто виправданих) запитань у цих сертифікатах Oracle вражає кожного разу знову ..
Voo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.