Я не впевнений, чи є елемент у специфікації мови Java, який диктує завантаження попереднього значення змінної ...
Є. Наступного разу, коли вам буде незрозуміло, що говорить специфікація, будь ласка, прочитайте специфікацію, а потім задайте питання, якщо це не зрозуміло.
... права сторона, (x = y)
яка, в порядку, що міститься в дужках, повинна бути обчислена спочатку.
Це твердження хибне. Дужки не передбачають порядок оцінювання . У Java порядок оцінювання зліва направо, незалежно від дужок. В дужках визначають, де знаходяться межі субекспресії, а не порядок оцінки.
Чому перший вираз оцінюється як хибний, а другий - істинний?
Правило для ==
оператора: оцінити ліву частину для отримання значення, оцінити праву частину для отримання значення, порівняти значення, порівняння - це значення виразу.
Іншими словами, значення expr1 == expr2
завжди таке ж, як якщо б ви написали temp1 = expr1; temp2 = expr2;
і потім оцінили temp1 == temp2
.
Правило для =
оператора з локальною змінною на лівій стороні: оцінити ліву частину для отримання змінної, оцінити праву частину для отримання значення, виконати призначення, результат - значення, яке було призначено.
Тож складіть це разом:
x == (x = y)
У нас є оператор порівняння. Оцініть ліву сторону для отримання значення - ми отримаємо поточне значення x
. Оцініть праву сторону: це призначення, тому ми оцінюємо ліву сторону для отримання змінної - змінної x
- ми оцінюємо праву сторону - поточне значення y
- присвоюємо їй x
, а результат - присвоєне значення. Потім ми порівнюємо початкове значення з x
присвоєним значенням.
Можна робити (x = y) == x
як вправу. Знову ж, пам’ятайте, всі правила оцінювання лівої сторони трапляються раніше, ніж усі правила оцінки правої сторони .
Я б очікував, що (x = y) спочатку буде оцінено, а потім він порівняє x із самим собою (3) і повернеться істинним.
Ваше очікування базується на наборі неправильних переконань щодо правил Java. Сподіваємось, тепер у вас є правильні переконання і в майбутньому очікуєте справжніх речей.
Це питання відрізняється від "порядку оцінювання підекспресій у виразі Java"
Це твердження хибне. Це питання є абсолютно германським.
x, безумовно, тут не є «субекспресією».
Це твердження також хибне. Це субекспресія двічі у кожному прикладі.
Його потрібно завантажувати для порівняння, а не «оцінювати».
Я поняття не маю, що це означає.
Мабуть, у вас ще багато помилкових переконань. Моя порада - ви прочитаєте специфікацію, поки ваші помилкові переконання не будуть замінені справжніми переконаннями.
Питання є специфічним для Java, а вираз x == (x = y), на відміну від надуманих непрактичних конструкцій, які зазвичай розробляються для складних питань інтерв'ю, походить від реального проекту.
Походження виразу не стосується питання. Правила таких виразів чітко описані в специфікації; читати!
Це мало бути однорядковою заміною ідіоми порівняння та заміни
Оскільки ця заміна на один рядок викликала велику плутанину у вас, читачеві коду, я б припустив, що це був поганий вибір. Зробити код більш стислим, але важче зрозуміти - це не виграш. Код швидше зробити швидше.
Між іншим, C # має порівняти та замінити як метод бібліотеки, який може бути приведений до машинної інструкції. Я вважаю, що у Java немає такого методу, оскільки він не може бути представлений у системі типу Java.