int number = 2;
System.out.println(number + number * (number + ++number));
У нас ведь вначале вычисляются значения в скобках, т.е. последовательность будет такая
(number + ++number)
и следующие операции уже должны проводиться с number равному 3, а в программе при умножении левый number и при суммировании они равны 2.
Почему так?Anonymous #2481584
30 уровень
Объясните последовательность
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Владислав Чабаненко
19 марта 2021, 17:30
Долго ломал голову и понял. Компилятор читает слева направо. Вот четыре выражения, на первый взгляд, одинаковых, но результат их вычисления будет разный.
Если a = 2
то
a * (a + ++a) = 2 * (2 + 3) = 10
a * (++a + a) = 2 * (3 + 3) = 12
(++a + a) * a = (3 + 3) * 3 = 18
(a + ++a) * a = (2 + 3) * 3 = 15
+3
Eduard
4 июня 2021, 10:58
Но почему тогда:
a * (a + ++a) = 2 * (2 + 3)
а не:
a * (a + ++a) = 3 * (2 + 3) ?
при этом
(a + ++a) * a =(2 + 3) *3 !
Если в начале выполняется действие в скобках, то после выполнения (a + ++a) а = 3, следовательно когда а умножаем на скобку а уже равно трем, но программа считает, что а до сих пор равно двум?
Видимо компилятор загружает все переменные слева на право не смотря на последовательность вычисления, а уже после загрузки всех данных, начинает производить расчеты согласно приоритетам!
0
Mal Reynolds Гуманитарий на всю голову
26 февраля 2021, 08:42
Думаю, дело в том, что оператор "++" - это не оператор присваивания и, соответственно, он не изменяет значение number, а только вычисляет значение. По сути он математическое выражение, ведь если бы вместо него тут стояло "number +1", это не изменило бы значение всех остальных number на 3. Получается 2 + 2*(2 + 3(префиксный инкремент "++" в первую очередь изменил значение именно этой number)).
-1
Iskander
7 июля 2021, 22:00
да, такой бред, как от вас давно не читал)
+2
Alex Korolev
16 декабря 2020, 02:52
2+2*(2+3)
+1
Artyom Alecsandrov Head of department в Center 2M
15 марта 2021, 10:37
Да, всё верно.
В "теории" (5 курс 9 лекция), приоритеты в выражении расставляются (в порядке убывания):
1) () // Слева направо
2) ++ // Справа налево
3) + // Слева направо
И по идее, если number = 2, то (number + ++number) = (3+3)
А по факту (number + ++number) = (2+3)
Значит у оператора ++ нет приоритета в вычислении перед + и, как показано в "теории" (5 курс 9 лекция)
и
не эквивалентны, поскольку нет операции присвоения a=a+1.
Правильно?
0