Разница между += и = 1+ в Java

Я и мой друг работали над задачей для школы. Мы просматриваем граф с помощью DFS и подсчитываем количество узлов в каждом заданном компоненте. Мы получаем очень разные результаты и определили, в чем разница.

При переходе к следующей рекурсии мой друг использует синтаксис

componentSize += DFS_visit(nextNodeToVisit);

тогда как я использую

componentSize = 1 + DFS_visit(nextNodeToVisit);

Я изначально думал, что это одно и то же, так в чем же разница? И какой из них следует использовать в нашем случае?

a += b является синонимом a = a + b
jsotola 14.05.2022 09:45

Они одинаковы только в том случае, если componentSize начинается с 1.

jonrsharpe 14.05.2022 09:46

Оператор + имеет более высокий приоритет, чем оператор =. Поэтому ваше утверждение гласит thing = (1 + thing). В зависимости от значения thing (если !=1) будет получен «неожиданный» результат, отсюда и несоответствие.

S3DEV 14.05.2022 09:47
And which one should be used in our case? ... очевидно тот, который дает правильные результаты
jsotola 14.05.2022 09:48

@jsotola Да, спасибо за ваш проницательный ответ. Правильный метод - всегда правильное решение...

thestarwarsnerd 14.05.2022 09:52

@S3DEV и jonrsharpe Спасибо за хорошие объяснения!:D

thestarwarsnerd 14.05.2022 09:53

просто обратите внимание, что a += b не совсем то же самое, что a = a + b - первый включает неявное приведение, а a оценивается только один раз! JLS 15.26.2. Составные операторы присваивания

user16320675 14.05.2022 10:16

На вторую часть вашего вопроса ("... какой из них следует использовать в нашем случае...") нельзя ответить, если вы не покажете нам, как вы используете эти строки. В этом отношении @jsotola прав. Но большая часть разработки программного обеспечения заключается в том, чтобы пробовать что-то, проверять правильность результатов и исправлять их, если они неверны. Ни один успешный разработчик программного обеспечения не пишет правильно всю программу перед ее запуском. Мы строим немного, тестируем, строим еще немного, тестируем и так далее. Так что комментарий jsotola о создании "... правильные результаты..." более проницателен, чем ваш саркастический ответ...

Dawood ibn Kareem 14.05.2022 10:55

... отдает должное.

Dawood ibn Kareem 14.05.2022 10:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
 componentSize += DFS_visit(nextNodeToVisit); 

означает

 componentSize = componentSize + DFS_visit(nextNodeToVisit);

Сравните это с

 componentSize = DFS_visit(nextNodeToVisit) + 1;

Увидеть разницу?

В целом a <op>= b означает примерно то же, что и a = a <op> b, где <op> — оператор. (Есть также приведение LHS к типу a.)


And which one should be used in our case?

Не понятно, что правильно. Нам нужно будет увидеть структуру данных и больше алгоритма.

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