BloodyWo1f
|
||||||
1 | ||||||
Постфиксный и префиксный декремент26.06.2013, 19:22. Показов 4390. Ответов 42
Метки нет (Все метки)
|
26.06.2013, 19:22 | |
Ответы с готовыми решениями:
42
Префиксный и постфиксный инкременты Префиксный и постфиксный инкремент Инкремент постфиксный и префиксный - принцип работы Как выполняется постфиксный и префиксный инкремент? |
17 / 17 / 3
Регистрация: 28.10.2012
Сообщений: 201
|
||||||
26.06.2013, 19:36 | 2 | |||||
А так?
1
|
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
|
|||||||||||
26.06.2013, 19:43 | 3 | ||||||||||
потому что есть разница между постфиксным и префиксным декрементом.
префиксной записью называется та, где оператор стоит перед операндом, --а постфиксной соответственно наоборот а-- разница между двумя этими действиями заключается в приоритете операции, у префиксной записи самый высокий приоритет, поэтому она выполняется прежде чем все остальные команды. в Вашем примере a = 5; cout << (--a)--; порядок выполнения команд будет следующий 1. присвоить 5 в а 2. выполнить префиксный декремент а (инструкция --а) а = 4 3. вывести а на экран (cout << a) (а = 4 см. предыдущую строку) 4. выполнить постфиксный декремент (инструкция а--) а = 3 поэтому после выполнения этой строчки на экран выведется число 4, а фактическое значение переменной a будет являться 3. Добавлено через 4 минуты для более детального понимания я приведу пример
2
|
BloodyWo1f
|
|
26.06.2013, 19:46 | 4 |
Огромное спасибо) всё понял.
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 19:53 | 5 |
Это undefined behaviour. Результат может быть каким угодно.
0
|
26.06.2013, 22:44 | 6 | ||||||||||
Никак не могу согласиться. В чём тут проявляется UB?
В данном же случае поведение строго определено скобками и свойствами операторов предекремента/постдекремента. Ответ: -Сначала выполнится выражение в скобках. -Переменная а будет уменьшена на 1 и возвращёно значение а после уменьшения, т.к. ПРЕдекремент. -Затем значение а будет ещё раз уменьшено вторым оператором --, но на вывод будет возвращено значение а бывшее ДО декремента, т.к. ПОСТдекремент. -Например, следующая программа выведет "-1 -2"
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 22:49 | 7 |
@Kuzia domovenok, переменная изменяет свое значение больше одного раза в пределах одной точки следования. http://stackoverflow.com/quest... nce-points
А именно:
0
|
26.06.2013, 22:57 | 8 |
Именно, что ты где-то услышал про
Добавлено через 1 минуту
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:01 | 9 |
Специально для Вас:
Ну и если еще не совсем поняли, то если уж подавно.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:07 | 11 |
@Croessmah, не аналогично, так как операция запятая в данном случая является точкой следования.
Если ++++i парсится компилятором как ++( ++i ), и это является UB, то чем лучше ( --i )-- ? В любом случае переменная меняется два раза в одном выражении и в пределах одной точки следования.
0
|
Неэпический
|
|
26.06.2013, 23:09 | 12 |
тем, что для вычисления постинкремента нужно сначала вычислить выражение в скобках, иначе имеем постинкремент неизвестного значения, то бишь сначала выполниться выражение в скобках
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
26.06.2013, 23:13 | 13 |
@Toshkarik,
а по твоему точка следования это только точка с запятой? @Kuzia domovenok, Здесь полностью прав(не часто мы с ним соглашаемся) идет уменьшение потом вывод на экран ( в поток) вот она точка следования и потом еще раз уменьшение никаких разночтений вот интересная статья http://alenacpp.blogspot.ru/20... oints.html
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:13 | 14 |
@Croessmah, дело не в скобках, а дело в изменении переменной больше одного раза в одном полном выражении, в данном случае в выражениях ++( ++i ); и ( --i )--; переменная меняется два раза, а по стандарту:
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:15 | 16 |
@ValeryS, а я разве где то говорил об точке с запятой? Я никому ничего не навязываю, лишь говорю о том, что написано в стандарте. Хотя в новом стандарте вроде как убрали понятие sequence point
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:18 | 18 |
Да причем тут "явно задан порядок" то. При вычислении этого выражения переменная изменяется дважды. Я приводил уже цитату по этому поводу, не я писал стандарт.
0
|
Неэпический
|
|
26.06.2013, 23:21 | 19 |
у постфиксного выше
http://ru.cppreference.com/w/c... precedence а значит имеем прединкремент временной переменной Добавлено через 42 секунды Вот тут UB, ибо порядок (--a) + (a--) не задан
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.06.2013, 23:23 | 20 |
@ValeryS, этот код не должен компилироваться.
0
|
26.06.2013, 23:23 | |
26.06.2013, 23:23 | |
Помогаю со студенческими работами здесь
20
Потокобезопасен ли префиксный инкремент/декремент? Поясните как работает постфиксный и префиксный оператор на примере Указатели: почему так происходит? Постфиксный и префиксный инкремент Постфиксный, и префиксный экземпляры оператора приращения: в чем разница? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |