Инкременты

  • 9
  • Недоступна
Внеси исправления в метод main(), чтобы он выводил в консоли число 20. В методе можно изменять только постинкремент на преинкремент и наоборот, а также постдекремент на предекремент и наоборот.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (43)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Шиша на ели Бардиллер в Ящик Пива
12 января, 11:47
Очень доходчивое объяснение с подводными камнями) https://www.youtube.com/watch?v=FXpuYDi0Ye4
Lonlost
Уровень 10, Ul'yanovsk, Russian Federation
3 января, 21:58
Ребята, для тех, кто не понимает, почему int b = a++ + (--a * a++) == 12! Компилятор высчитывает сначала все инкременты и декременты слева на право, а уже потом математические операции в скобках, и т.д. 3 + (3 * 3) = 12 ; а = 4; ( а == 3 ) + ( ( ( а == 3 + 1 ) - 1) * ( а == 3 ) == 12; а == 4; Скобки не имеют приоритета над ++ и -- . Таблица приоритетов в лекции вводит в заблуждение. Справа налево операция проводится видимо либо в каких-то других случаях, либо в каком-то другом, более глубоком понимании механизма вычисления.
Lonlost
Уровень 10, Ul'yanovsk, Russian Federation
3 января, 23:42
Про Ассоциативность Самый последний комментарий объяснил, что это такое и как оно работает.
Илья Малафеев
Уровень 13, Russian Federation
30 декабря 2021, 20:09
С кодом решения понятно, благодаря комментариям ниже: int b = ++a + (a-- * ++a) "а" сначала везде растет до 4 за счет "а++" в скобках, в скобках получаем 16; далее "а" уменьшается везде до 3 за счет "а--"; далее "а" снова увеличивается до 4 за счет "++а" вне скобок и далее 4 прибавляется к 16, давая ответ 20. Супер. Объясните пожалуйста, почему в оригинальном коде задания: int b = a++ + (--a * a++) b = 12? По логике решения должно быть: "а" сначала везде уменьшается до 2 за счет "--а" в скобках, в скобках получаем 2*2 = 4; далее "а" за счет "а++" (который был в скобках) везде растет до 3; далее при сложении получаем 7 и "а" увеличивается до 4 за счет "а++" (который вне скобок); Итак b должно быть равно 7, но программа выводит 12. Почему???
Turushkin_Stanislav
Уровень 14
26 декабря 2021, 09:37
не понимаю, чисто ради теста решил посмотреть что будет, по моей логике как я понял это все сначала идет в скобках () дальше мы там получаем А 4 сразу потом другая А 5, дальше идет * в скобках) перемножили ну 20 окей, те ++а которое за скобками теперь как я понимаю 6 + 20 = 26 а программа выдает 34? ну и где логика движений?
//      6        4   20   5 =26
        int b = ++a + (++a  *    ++a);
TripleAsh Стойка микрофона в Comedy Club prod.
26 ноября 2021, 15:54
Пошагово: Изначально переменная a = 3(она локальная, т.е. любой декремент и инкремент меняет её на уровне метода, собственно там где она и была инициализирована), первым идет преденкремент в скобках, и вот переменная а=4, затем операция умножения 4*4=16. потом декремент, и переменная а = 3. За скобками с преденкрементом становится снова а =4 и потом операция сложения 4 + 16 = 20.
Oleksandr Lysykh
Уровень 26, Киев, Ukraine
12 ноября 2021, 17:25
ok, прочитал весь тред, прочитал что с право на лево приоритеты у ++, -- прочитал про 4+(4*4) но открыл виртуальную машину и вот три примера которые выбили из себя. помогите разобраться.
Mary Grimm
Уровень 35
13 ноября 2021, 10:44
попробуй проверить подключение jdk в программе, File-->ProjectStructure-->ProjectSDK должен быть подключен jdk
Lonlost
Уровень 10, Ul'yanovsk, Russian Federation
3 января, 22:31
1. ( а == 3 ) * ( ( а == 3 - 1 ) + 1 ) == 9; 2. ( а == 3 ) + ( ( а == 3 ) * ( ( а == 3 - 1 ) + 1 ) == 12; 3. ( а == 3 ) + ( ( а == 3 - 1) * ( а == 2 + 1 ) ) == 7; Сначала проводиться крементация слева направо, потом математическое выражение.
Vasilisk
Уровень 13, Волгоград, Russian Federation
20 октября 2021, 22:03
наверно более правильным объяснением будет таким : так как скобки имеет больший приоритет подсчет начинается с них, но это воспринимается отдельным выражением в которым участвует аргумент а. (а--*++а) - сначала к 3+1 а=4, после чего получилось 4*4=16, а так как выражение закончилось сработало а--, которое стало равно а=3 дальше следующим шагом было ++а , прибавление к 3+1 и снова стало а=4 и полное выражение стало 4+(4*4) ВУАЛЯ !!! магия JAVA
JaVadim
Уровень 10, Королев, Russian Federation
1 декабря 2021, 20:40
Доходчиво, понятно. Спасибо. Для себя понял, что инкременты и декременты нужно воспринимать как полноценные действия с соответствующим приоритетом, а не просто в качестве приставок к переменной по разные стороны от привычных со школы знаков, тогда все становится ясно.
Алексей
Уровень 10, Самара, Russian Federation
14 января, 05:37
Почему тогда выражение int b = a + (a * ++a) не равно 20? Получается мы "а" в скобках увеличиваем на 1. в скобках становится 16. прибавляем еще а. должно быть 20. а ответ 15
Riga Android Developer
16 октября 2021, 23:54
ох уж эти приоритеты
hamster🐹 ClipMaker в TikTok
30 сентября 2021, 13:42
Каждый раз когда мы обращаемся к переменной "а" в переменной "b": // если "++" перед переменной "a", то значение переменной сразу увеличивается // если "++" после переменной "a", то значение переменной увеличивается при след обращении к переменной // с "--" тоже самое int a = 3; int b = a++ + (--a * a++); 1. Первое обращение а++ = 3, но при след обращении уже 4 2. (--a * a++) Второе обращение --а = 4 - 1 = 3 Третье обращение а++ = 3 но при след обращении уже 4 И соответственно 3 + ( 3 * 3) = 12 P.S. нужно сделать так чтобы переменная а на протяжении всего вычисления в переменной b была == 4
Сергей Коваленко
Уровень 29, Краснодар
18 ноября 2021, 19:09
👍
WALLY Кузьмин
Уровень 14, Одесса
4 декабря 2021, 13:33
при первом выражении a++,это имеется ввиду то что в скобках? почему тогда выражение справа налево читаете? такой приоритет?
dimask
Уровень 11, Санкт-Петербург
29 сентября 2021, 21:00
Мучался долго но оказалось все просто: Идем с лева на право: a=3 1) ++a = 4 (а у нас везде равняется 4 на данный момент) 4+(4--*++4) 2) (a--) = 4-1 , переменная стала 3 имеем след вид 4+(4*++3) 3)(++a) =4 имеем вид 4+(4*4)