вот правильное решение: ++a + (a--*++a).Посмотрел.Ну как может быть:4+(3*4)=20? Можно сделать ++a+(++a*++a),но условия не позволяют.Или я чего то не догоняю?
Игорь
27 уровень
ну ни фига не понятно
Обсуждается
Комментарии (21)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ArzamaS
1 апреля, 06:55
так и не понятно в итоге, как это все работает, к сожалению....
0
ViiRusZx #3435538
7 апреля, 16:17
int a = 3;
int b = ++a + (a-- * ++a);
1) - получается первая ++а(увеличится сразу до 4х) итог 4+(а-- + ++а)
2) - вторая а(которая а--) будет равна, так как на её место пойдет первая а, итог
4 + (4-- + ++а)
3) - третья а должна после инициализации уменьшится на 1(т.к. 4--) и увеличится на 1 (т.к. ++а)
итог 4+(4+ (4 которую уменьшаем на 1(по тому что она должна быть значением этого "4--"), потом увеличиваем на 1)
0
Dana Timurova
23 мая 2023, 09:02
int a = 3;
int b = ++a + (a-- * ++a);
++a - тк ++ перед, будет сразу +1. получается а=4
а-- - тут будет 4, но след а будет -1. получается сейчас а=4, след а=3
++а - а был 3, но тк ++ стоит перед, будет +1. выходит а=4.
4+4*4
+8
ГоффMaster
17 мая 2023, 01:06
Логика простая. Сначала машина подставляет вместо переменных их значения, тупо слева направо, не обращая внимания на очерёдность выполнения арифметических операций, но с соблюдением пост- пре- де- и ин- криментов, и только потом, когда вместо переменных стоят числа, считает выражение, уже с соблюдением порядка операций.
+10
ABates
7 мая 2023, 11:27полезный
++3 + (3-- * ++3) = ++4 + (4-- * 4) =++4 +( 16 - 1) = ++4 + 15 = 5 + 15 = 20
+2
Алексей Михайлов
16 мая 2023, 13:04
как ты получил
++4 + (16 - 1)?
там должно быть
++3 + (16)
0
ABates
16 мая 2023, 16:45
смотри, сначала операция в скобках, перед умножением ++а = 3 увеличивается на 1 (везде где есть а в этом уравнении), после того как результат в скобках уже посчитана сначала первое а уже ранее увеличенное на 1 еще раз увеличивается на 1.
Или же что бы было понятно так (a + 1) + (a * (a + 1) - 1).
0
Алексей Михайлов
16 мая 2023, 18:19
не всё так просто
чему равно b? +1
Роман Rime
16 июня 2023, 09:17
Не логично.
Сначала идут скобки: (3-- * ++3) == (4-- * 4) == 16 (после того, как скобки посчитали, происходит "а--" и, соответственно, "а" становится == 3.
далее левая часть выражения: ++3 + 16 == 4 + 16 == 20;
Выражение в скобках уже посчитано и из него не отнимается "-1", так как "-1" отнимается от "а" после завершения выражения в скобках.
0
Anonymous #3303140
16 июня 2023, 09:50
Сначала, перед тем как начать выполнять вычисление значения выражения, джава гарантирует, что известно значение каждого операнда этого выражения. Поэтому сначала не обращая внимания на скобки выполняются последовательно вычисления каждого операнда:
И потом уже после того, как все операнды были вычислены, джава-машина выполняет вычисление выражения:
Кстати, скобки тут не нужны, т.к. умножение и без них приоритетнее, чем сложение, а на порядок вычисления операндов скобки не влияют. +2
Theb Cowe
26 сентября 2023, 13:45
У скобок приоритет выше, поэтому ++4 + (4-- * 4) = ++4 + (4 * 4) /* держим в уме -- */ = ++3 + 16 = 20. Если б скобок не было при такой же расстановке инкрементов/декрементов, получилось бы 5 + 5 * 5 = 30, а только после этого значение a уменьшилось бы на 1
0
Anonymous #3303140
26 сентября 2023, 19:13
Нельзя вообще писать ++4, это не валидная запись. Инкременты можно использовать только с целочисленными переменными. Это первое.
Второе - это собственно то, что уже написано в моём предыдущем комментарии, а именно- значение всех операндов вычисляется ДО начала вычисления значения всего выражения. Это никак не связано с наличием или отсутствием скобок. Это прописано в спецификации языка, читай JLS:
15.7.2. Evaluate Operands before Operation
The Java programming language guarantees that every operand of an operator (except the conditional operators &&, ||, and ? :) appears to be fully evaluated before any part of the operation itself is performed.
Скобки расставляют только приоритеты между арифметическими операциями. А вычисление значения выражения начнётся только после того, как выполнится вычисление значение для каждого из операндов в отдельности.
Другими словами, запись вида a++ – это не число, а некоторая функция, и прежде чем начать вычислять значение выражения, смотреть вообще где там скобки, программе требуется знать, какое значение эта функция (инкремент) возвращает. А эта функция по ходу своего вычисления меняет и текущее значение своего параметра (переменной a).
0
Theb Cowe
2 октября 2023, 13:00
И в чём тогда отличие префиксной записи от постфиксной, если они одинаково работают?
0
Anonymous #3303140
2 октября 2023, 15:38
Где я написал, что они работают одинаково? Я написал, что обе функции вычисляются до начала вычисления арифметических выражений.
А отличие в том, что постфикс возвращает текущее значение аргумента и при этом увеличивает сам аргумент, а префикс увеличивает аргумент и затем возвращает его новое значение.
0
ABates
7 мая 2023, 11:23полезный
на самом деле все очень просто, если плюсы стоят перед переменной то данная переменная увеличивается на единицу перед дальнейшими операциями во всех местах в уравнении где она присутствует, а если после то сначала операция и только потом добавление или вычитание 1.
+5
Игорь
10 мая 2023, 08:04
Вот оно!то чего не догнал.Спасибо.
+1
Алексей Михайлов
6 мая 2023, 10:29полезный
изначальное значение в а какое?
если 3 то всё верно
сначала действие в скобках
из за префикса ++а сначала выполнится инкремент(причём инкремент всех а), умножение, а потом декремент и сложение
++а + (а-- * ++а) == 20
сначала инкремент в скобках а = 4
++3 + (3-- * ++3) == 20
потом умножение и декремент а = 3
++4 + (4-- * 4) == 20
потом опять инкремент и сразу сложение а = 4
++3 + 16 == 20
результат = 20
+2
Hawk Alexander
16 мая 2023, 12:13
с этим примером понятно, но вопрос почему в другом примере
int a = 3;
int b = --a + (a-- * ++a);
b получается 6 в компиляторе, как это возможно если считать в уме получается 18
--3 + (3-- * ++3)
--4 + (4-- * 4)
--3 + 16
2+16
0
Алексей Михайлов
16 мая 2023, 13:17
нужно смотреть приоритет операторов,
но по сути 6 ты можешь получить только 2*2+2 по другому никак
0
Алексей Михайлов
16 мая 2023, 14:04
попробовал поэкспериментировать и узнал для себя неприятный сюрприз
оказывается
т.е. постфиксный декремент и префиксный инкремент компенсируются, а вот такая запись
т.е. сначала срабатывают все декременты потом инкремент и толь после матеметические операции
у меня такое ощущение что компилятор шалит... +1
Anonymous #3303140
17 мая 2023, 12:07
Всё правильно. Согласно 15.7.2 спецификации джавы у тебя, прежде чем приступить к вычислению значения выражения, вычисляются все значения операндов. Это происходит справа налево. Именно поэтому твоё выражение эквивалентно 2 + 2 * 2, и a после его вычисления также равно двум, т.к. последний унарный оператор был префиксом, т.е. не изменял значение a после вычисления.
0