С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 14.07.2022
Сообщений: 5
1

Порядок вычислений в выражениях с инкрементами и декрементами

14.07.2022, 18:36. Показов 777. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Прошу помочь разобраться с порядком вычислений в следующих выражениях:

i = 3;


a = (--i)*(i++); // = 6
Почему 6?
1-е действие: (--i)=2; (i++)=3;
2-е действие: 2*3=6;

Теперь так:

a = (--i)*(++i); // = 9
Почему 9?
1-е действие: (--i)=2; (++i)=3;
2-е действие: 2*3=6;

1- то что в скобках, 2 - умножение. Никак не могу понять почему во втором случае 9 а не тоже 6.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2022, 18:36
Ответы с готовыми решениями:

Пример с инкрементами и декрементами
Пример: int a=2, b=3; b*=(b++)*(——b)*(——b)+(——a)*(++a)/(++a)+(++b)*(++a); ...

Порядок вычисления в логических выражениях.
Мне стыдно такое спрашивать, но всё же. Что-то нагуглить не получается. Есть выражение вида A...

Порядок вычисления в условных выражениях
Привет ! Есть такой код: int Value = 0; // // Допустим, SomeFunction всегда меняет...

Порядок вычислений C++
Каков порядок вычисления для этого предложения,какие предположения можно сделать о типе...

11
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
14.07.2022, 19:11 2
неопределённое поведение. Чаще всего зависит от компилятора
/thread
1
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
14.07.2022, 19:27 3
Цитата Сообщение от Pr0ger Посмотреть сообщение
Никак не могу понять почему во втором случае 9
Сначала выполняется то, что в скобках. А потом перемножается.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
14.07.2022, 19:36 4
Я имею в виду то, что операция пред-инкремента/пред-декремента в данном случае производится напрямую над ячейкой памяти на стеке, которую компилятор выделил под переменную i, память под промежуточный результат не выделяется. Вот и всё. Это прекрасно видно в дизассемблере.

UB это или нет - я хз (я в си не шарю), но вроде как всё логично.

Порядок вычислений в выражениях с инкрементами и декрементами


Порядок вычислений в выражениях с инкрементами и декрементами
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
14.07.2022, 19:41 5
Цитата Сообщение от Verevkin Посмотреть сообщение
UB это или нет - я хз (я в си не шарю),
https://en.cppreference.com/w/... eval_order
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
14.07.2022, 19:49 6
Цитата Сообщение от DrOffset Посмотреть сообщение
https://en.cppreference.com/w/... eval_order
Ну тем более, значит и не UB.
Просто надо понимать, как это работает и/или не писать такие мудацкие выражения на практике.
Проще надо быть и не создавать себе проблем на ровном месте.
C++
1
2
int i = 3;
int a = (i - 1) * (i + 1);
Миниатюры
Порядок вычислений в выражениях с инкрементами и декрементами  
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
14.07.2022, 19:51 7
Цитата Сообщение от Verevkin Посмотреть сообщение
Ну тем более, значит и не UB.
Как это так значит? Ты повнимательнее прочитай.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
14.07.2022, 20:09 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Как это так значит? Ты повнимательнее прочитай.
Да я и невнимательно не читал.
0
0 / 0 / 0
Регистрация: 14.07.2022
Сообщений: 5
15.07.2022, 07:43  [ТС] 9
Я начал изучать С++ по книге П.А.Орленко, Евдокимов П.В. - C++ на примерах. Практика, практика и только практика () - 2019.

Выражения оттуда.

Цитата Сообщение от Verevkin Посмотреть сообщение
Я имею в виду то, что операция пред-инкремента/пред-декремента в данном случае производится напрямую над ячейкой памяти на стеке, которую компилятор выделил под переменную i, память под промежуточный результат не выделяется. Вот и всё. Это прекрасно видно в дизассемблере.
Тогда почему в первом выражении если i=3; a = (--i)*(i++); // = 6
(--i) - в стеке 2;
(i++) - в стеке 3;

3*3=9 но не 6?
Миниатюры
Порядок вычислений в выражениях с инкрементами и декрементами   Порядок вычислений в выражениях с инкрементами и декрементами  
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,870
15.07.2022, 08:38 10
Цитата Сообщение от Pr0ger Посмотреть сообщение
Тогда почему в первом выражении
Не существует никакого "почему". Ваши выражения бессмысленны с точки зрения С++. У них нет никакого "порядка вычисления" и никакого определенного результата. Поведение этих выражений не определено. Нет там никакого 6.

Цитата Сообщение от Pr0ger Посмотреть сообщение
Я начал изучать С++ по книге П.А.Орленко, Евдокимов П.В. - C++ на примерах. Практика, практика и только практика () - 2019.
Процитированный пример в книге, как, впрочем, и текст перед ним - полнейшая безграмотная чушь. Это книгу - ффтопку.

...рассмторим...декрменета...
Не надо пытаться изучать С++ по такой макулатуре.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
15.07.2022, 09:15 11
Цитата Сообщение от Pr0ger Посмотреть сообщение
Тогда почему
По кочану. И по капусте.
Чо пристал-то? Я не шарю ни в Си, ни в ассемблере.
------
Пост-инкремент участвует в выражении через копирование исходного значения. Именно копия умножается со значением в ячейке памяти переменной i. Но это неточно, могу ошибаться.

Порядок вычислений в выражениях с инкрементами и декрементами
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
15.07.2022, 12:23 12
таращимся на UB и радуемся , ищем смысл жизни
C++
1
2
3
4
5
6
    int i = 3;
    cout<< ((--i)+(i--)+(--i)) << endl; // 3
    i = 3;
    cout<< ((--i)+(--i)+(i--)) << endl; // 3
    i = 3;
    cout<< ((i--)+(--i)+(--i)) << endl; // 4
0
15.07.2022, 12:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2022, 12:23
Помогаю со студенческими работами здесь

Как правильно скорректировать порядок выполнения вычислений
Как правильно скоректировать порядок выполнения вычеслений математических уровнений например: ...

Цикл for (с 2-мя инкрементами)
for (double i(S.x1), float* p(S.arr); i &lt; S.x2; i += S.dx, p++) { *p = calculate(S.a, S.b, i);...

Вычисление выражений с пост и декрементами в Си
Доброго времени суток! Начал изучать си и решил испробовать такие выражения(снизу). И не могу до...

Программа должна отображать ход вычислений, допускать приостановку и прерывания вычислений
Разработать программу для сравнения эффективности двух заданных алгоритмов сортировки путем их...

Реализация в среде вычислений прямого алгоритма вычислений
Индуктивность дросселя определяется формулой L=μ*μ0*S/l*W^2 Определить число слоев намотки...

порядок группы равен 4 и в ней только 1 элемент имеет порядок 4. какой порядок имеют остальные элементы? сколько в ней подгрупп?
Совсем не чего не понятно

Порядок отрицательных членов изменить на обратный, порядок неотрицательных сохранить
Задача по делфи(нужно все 3 пункта в 1 программе сделать) Прошу Помочь В условиях задания 3 а)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru