Как Java обновляет значение переменной?

Итак, результат этой функции равен 0. Это возможно только в том случае, если Java обновляет значения после всего оператора, предшествующего ';'. завершилось. Если это так, то какой смысл иметь операцию равенства? Разве это не должно соответствовать z =x +y-(x+y);

class HelloWorld {
  
  public static void main(String[] args) {
    int x = 10;
    int y = 20;
    int z = x += y -= x += y;
    System.out.println(z);
  }
}

Я запустил код и вот что я смог сделать. Я пытался поискать, верен ли мой вывод, но ничего не нашел по этому поводу?

Обновлено: Мой вопрос: почему мы используем значение x = 10 во всех следующих выражениях, когда x+=y в конечном итоге обновит значение x до 30?

Исправьте отступы.

Basil Bourque 07.07.2024 18:40
z = 10 + (20 - (10 + 20) => z = 10 + (20 - 30) => z = 10 + (-10) => z = 10 - 10 => z = 0. Я не вижу здесь никакой проблемы. Подробнее об ассоциативности операторов в Java читайте здесь: javatpoint.com/associativity-of-operators-in-java
JustAnotherDeveloper 07.07.2024 18:41

самый важный момент: не пишите такой код; второе: проверьте спецификацию языка Java 15.7. Порядок оценки и 15.26.2. Составные операторы присваивания ||| это выражение можно записать как int z = (x += (y -= (x += y)));

user85421 07.07.2024 18:57

@user85421 user85421 К сожалению, я могу проголосовать за ваш комментарий только один раз.

WJS 07.07.2024 19:04

Я не совсем понимаю, в чем смысл этого вопроса.

EJoshuaS - Stand with Ukraine 07.07.2024 21:13

@EJoshuaS-StandwithUkraine Какой смысл в знаке равенства, если значение будет обновляться только после завершения обновления всего выражения?

Janb 07.07.2024 21:22

Очень немногие используют эти операторы в середине выражения. Это затрудняет чтение и понимание выражений. Обычно он используется для отдельных утверждений, таких как x +=y; вместо x= x+y;. Это остаток от C.

aled 07.07.2024 22:50

«почему мы используем значение x = 10»: ответ дан в первой ссылке Я уже писал ранее: «Если оператор является составным оператором присваивания (§15.26.2), то оценка левого Операнд -hand включает в себя как запоминание переменной, которую обозначает левый операнд, так и выборку и сохранение значения этой переменной для использования в подразумеваемой двоичной операции». и, например, в a += b -= c (или a += (b -= c)) результат является результатом +=, поэтому Java запоминает значение a и затем вычисляет b -= c

user85421 08.07.2024 07:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
8
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Java «сначала вычисляется левый операнд». Это означает, что приведенное выше выражение будет решено следующим образом:

int z = (x = x + (y = y - (x = x + y)));

int z = (x = 10 + (y = y - (x = x + y)));

int z = (x = 10 + (y = 20 - (x = x + y)));

int z = (x = 10 + (y = 20 - (x = 10 + 20)));

int z = (x = 10 + (y = 20 - (30)));

х станет 30.

int z = (x = 10 + (-10));

х станет 30. у станет -10.

интервал г = (х = 0);

х станет 0. у станет -10.

интервал г = 0; z станет 0;

Другие вопросы по теме