Почему == имеет более высокий приоритет, чем postfix в Java?

#java #equality #operator-precedence #post-increment #associativity

#java #равенство #оператор-приоритет #пост-инкремент #ассоциативность

Вопрос:

Пожалуйста, кто-нибудь может помочь мне понять, почему равенство имеет более высокий приоритет перед postfix здесь?

 int x = 6;
System.out.println(7 == x  );
 

Вывод: false

Согласно некоторым источникам приоритета операторов в Java: postfix должен иметь более высокий приоритет, чем оператор равенства. В этих источниках также упоминается ассоциативность операторов (но она должна появляться, когда уровень приоритета операторов в выражениях одинаков).

Ответ №1:

Если бы приоритет равенства был выше, чем у приращения postfix , то 7 == x он был бы проанализирован как записанный (7 == x) . Это, конечно, не то, что происходит, поскольку не может быть применено к логическому значению, которое 7 == x и будет производить. Оно также не может быть применено к выражению, которое не является переменной. Таким образом, безусловно, выражение анализируется как записанное 7 == (x ) ; оператор postfix имеет более высокий приоритет.

Что вас смущает, так это то, что результат сравнения равен false , но этого следовало ожидать. Это слишком ожидаемо, потому что значение postfix increment ( x ) является значением переменной до ее увеличения. x безусловно, увеличивается, и оно увеличивается до выполнения сравнения равенства, но сравнение не между 7 и значением x . Это между 7 и значением, возвращаемым x , которое равно 6 (старое значение x ).

Если бы вы написали 7 == x , используя оператор увеличения префикса, тогда это сработало бы так, как вы ожидали, потому что оператор увеличения префикса возвращает новое значение переменной. Вот почему у нас есть два разных оператора приращения: иногда вы хотите использовать старое значение (постфиксный оператор), а иногда вы хотите использовать новое значение (префиксный оператор).

Ответ №2:

Как следует из названия postincrement , приращение происходит после присваивания. Таким образом, 7 == x оценивается как

 7 == x
x = x   1
 

В отличие от этого, с предварительным увеличением, 7 == x оценивается как

 x = x   1
7 == x
 

ДЕМОНСТРАЦИЯ:

 public class Main {
    public static void main(String[] args) {
        int x = 6;
        System.out.println(7 ==   x);
    }
}
 

Вывод:

 true