Рассмотрим следующий пример:
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.