Играл с инкрементами и вообще не понимаю одного момента:
int a=3;
int b= a++ +(++a * --a); // 3 + ( 5 * 4 )
Ответ b=23.
Вопрос именно по первому а++ - почему он все равно считается программой за 3?
Понимаю, что сначала присваивается значение , а потом увеличиается на единицу, НО, почему в итоге все равно считается как 3?
ИЛИ прога думает "хорошо, сначала использую 3 в выражении, но увеличу это значение на 1 для будущих вычислений"
Также интересный случай когда
b= a++ + (a-- * a++) // Получается, что изменение переменной "отстает" на одно вычисление (3 + ( (3+1) * (4-1) ) - такое объяснение как раз и дает ответ на мой же вопрос выше. Хочется услышать еще мнения по поводу -фиксных -крементов
Kirill Andryukhin
10 уровень
Вопрос на понимание
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Kirill Andryukhin
22 февраля 2022, 15:57
Спасибо всем ответившим!
Приятно в чем-то убедиться и увидеть поддержку своих домыслов!
0
Денис Викторович
21 февраля 2022, 09:45
Добрый день.
Вы сами все прекрасно описали: "... прога думает "хорошо, сначала использую 3 в выражении, но увеличу это значение на 1 для будущих вычислений..."".
Если пытаться объяснить все иными словами, то смысл останется неизменным, только интерпретация будет иной. У меня самого ушло минут 30 на то, чтобы разобраться с постфиксными инкрементами.
+1
Евгений
19 февраля 2022, 06:36
Ниже все правильно расписали. Для java так и будет.
cgg из комплекта qt 5.12.9 дает ответ 19.
Эту тему разбирали на хабре. Писали код, компилировали на разных языках, разными версиями компиляторов. Результаты были разнообразные. Сейчас, к сожалению, этот пост на хабре закрыт.
В общем, старайтесь такого не писать :)
+1
ГоффMaster
18 февраля 2022, 20:14
Если я не ошибаюсь, при вычислении выражения джава сначала подставляет значения переменных, тупо слева направо, вне зависимости от порядка выполнения арифметических операций, а потом уже всё считает - учитывая этот порядок.
Поэтому сначала вместо первого а подставляется значение 3, переменная после этого инкрементируется до 4 так как за ней стоят два плюсика. Потом идёт ++а, переменная а, которая уже 4 сначала инкрементируется (потому что плюсики перед ней), потом подставляется, получается 5. Потом идёт --а, сначала декримент, получается 4. Итого к вычислению 3+(5*4), вот это и будет подсчитано = 23.
b= a++ + (a-- * a++)
аналогично. После подставки получается 3 + (4 * 3) = 15, при этом a выходит из этого со значением 4.
+1
Павел Безумный учёный Expert
18 февраля 2022, 19:23полезный
Оператор постфиксного инкремента a++ означает, что для выполнения следующей смежной операции (сложение), в котором задействуется переменная a, будет использовано её "старое" значение (поскольку сначала происходит возврат значения и подстановка его на место a и только после этого увеличение на единицу). Операция сложения не может быть выполнена немедленно, поскольку далее следуют более приоритетные скобки. Операция сложения откладывается, "запоминая" это "старое" значение переменной a. Но поскольку оператор постфиксного инкремента выполняет не только возврат значения, но и его увеличение, то при последующем обращении к переменной a выяснится, что её текущее значение - 4, а префиксный инкремент тут же увеличит это значение ещё на единицу. В этой точке вместо a фиксируется значение 5, после чего аналогичным образом выполняется префиксный декремент, возвращающий в результате значение 4. После выполнения умножения происходит возврат к отложенной операции сложения, в которой, как уже было сказано, первое слагаемое получило значение 3.
+3
Денис Викторович
21 февраля 2022, 09:46
Здравствуйте, Павел.
А Вы точно Павел, или все же Химер Роковой?😂
0
Павел Безумный учёный Expert
21 февраля 2022, 09:51
Здравствуйте!
Наверное, и то и другое) Эль псай конгру!
0