Рассмотрим следующий пример:
class Quirky {
public static void main(String[] args) {
int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false
x = 1; // reset
System.out.println((x = y) == x); // true
}
}
Я не уверен, есть ли в спецификации языка Java элемент, который диктует загрузку предыдущего значения переменной для сравнения с правой стороной (x = y), который в порядке, подразумеваемом скобками, должен быть вычислен первым.
Почему первое выражение оценивается как false, а второе - как true? Я ожидал, что (x = y) будет сначала оценен, а затем он сравнил бы x с самим собой (3) и вернул бы true.
Этот вопрос отличается от порядка вычисления подвыражений в выражении Java тем, что x здесь определенно не является "подвыражением". Его нужно загружать для сравнения, а не "оценивать". Вопрос специфичен для Java, и выражение x == (x = y), в отличие от надуманных непрактичных конструкций, обычно создаваемых для сложных вопросов интервью, пришло из реального проекта. Предполагалось, что это будет замена одной строки для сравнения и замены
int oldX = x;
x = y;
return oldX == y;
которая, будучи даже более простой, чем инструкция x86 CMPXCHG, заслуживает более короткого выражения в Java.