0 / 0 / 0
Регистрация: 14.07.2022
Сообщений: 5
|
|
1 | |
Порядок вычислений в выражениях с инкрементами и декрементами14.07.2022, 18:36. Показов 777. Ответов 11
Метки нет (Все метки)
Добрый вечер. Прошу помочь разобраться с порядком вычислений в следующих выражениях:
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
|
14.07.2022, 18:36 | |
Ответы с готовыми решениями:
11
Пример с инкрементами и декрементами Порядок вычисления в логических выражениях. Порядок вычисления в условных выражениях Порядок вычислений C++ |
14.07.2022, 19:11 | 2 |
неопределённое поведение. Чаще всего зависит от компилятора
/thread
1
|
Злостный нарушитель
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 |
0
|
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
|
||||||
14.07.2022, 19:49 | 6 | |||||
Ну тем более, значит и не UB.
Просто надо понимать, как это работает и/или не писать такие мудацкие выражения на практике. Проще надо быть и не создавать себе проблем на ровном месте.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
14.07.2022, 19:51 | 7 |
0
|
0 / 0 / 0
Регистрация: 14.07.2022
Сообщений: 5
|
|
15.07.2022, 07:43 [ТС] | 9 |
Я начал изучать С++ по книге П.А.Орленко, Евдокимов П.В. - C++ на примерах. Практика, практика и только практика () - 2019.
Выражения оттуда. Тогда почему в первом выражении если i=3; a = (--i)*(i++); // = 6 (--i) - в стеке 2; (i++) - в стеке 3; 3*3=9 но не 6?
0
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,870
|
|
15.07.2022, 08:38 | 10 |
Не существует никакого "почему". Ваши выражения бессмысленны с точки зрения С++. У них нет никакого "порядка вычисления" и никакого определенного результата. Поведение этих выражений не определено. Нет там никакого 6.
Процитированный пример в книге, как, впрочем, и текст перед ним - полнейшая безграмотная чушь. Это книгу - ффтопку.
0
|
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
|
|
15.07.2022, 09:15 | 11 |
По кочану. И по капусте.
Чо пристал-то? Я не шарю ни в Си, ни в ассемблере. ------ Пост-инкремент участвует в выражении через копирование исходного значения. Именно копия умножается со значением в ячейке памяти переменной i. Но это неточно, могу ошибаться.
0
|
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
||||||
15.07.2022, 12:23 | 12 | |||||
таращимся на UB и радуемся ,
0
|
15.07.2022, 12:23 | |
15.07.2022, 12:23 | |
Помогаю со студенческими работами здесь
12
Как правильно скорректировать порядок выполнения вычислений Цикл for (с 2-мя инкрементами) Вычисление выражений с пост и декрементами в Си Программа должна отображать ход вычислений, допускать приостановку и прерывания вычислений Реализация в среде вычислений прямого алгоритма вычислений порядок группы равен 4 и в ней только 1 элемент имеет порядок 4. какой порядок имеют остальные элементы? сколько в ней подгрупп? Порядок отрицательных членов изменить на обратный, порядок неотрицательных сохранить Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |