![]() |
|
Модераторы: bsa |
![]()
|
|
| wrathchildtoo |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
В общем, заметил такую особенность, что при перегрузке оператора постфиксного инкремента, если не предпринимать особых мер, приоритет его меняется на префиксную форму (становится как у префиксной формы). Декремента это касается в равной степени.
Если же использовать некоторую уловку в виде возвращения временного значения, то такой перегруженный оператор работает корректно только в определенных случаях. Листинг проги с перегрузкой инкремента без возврата временного значения:
Операторная функция перегрузки пост-инкремента с возвращаемым временным значением:
Если вызывать эту функцию из выражения:
то уже при выводе на экран значения "а" будет выводится инкрементированное значение. Вот, собственно, и возникает вопрос: существуют ли какие-нибудь более универсальные приемы при перегрузке постфиксных функций? Это сообщение отредактировал(а) wrathchildtoo - 21.7.2009, 11:09 |
||||||||
|
|||||||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
мне кажется проблема возникает из-за непонимания приоритета операторов. сдвиг влево (<<) расположен в таблице приоритетов ниже, чем постфиксный инкремент (lvalue++). это значит, что он будет выполняться после того, как инкремент отработает. *** вот пример, иллюстрирующий "проблему" не смотря на то, что "hello" написано левее, чем вызов функции, функция - отрабатывает первой. опять же из за приоритета.
Это сообщение отредактировал(а) zim22 - 21.7.2009, 11:22 |
||||
|
|||||
| wrathchildtoo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
||||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
в таком случае да поможет вам Бог в какой строке? |
|||
|
||||
| wrathchildtoo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) wrathchildtoo - 21.7.2009, 11:30 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ассемблерный листинг другого мнения. обратите внимание на строку со знаками восклицания
|
|||
|
||||
| wrathchildtoo |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
zim22, ну я же не выдумываю:
вот что выводится на экран:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| wrathchildtoo |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
Приношу свои извенения. Со встроенными типами, похоже, постфикс работает тоже через временное значение:
Тему можно закрывать Это сообщение отредактировал(а) wrathchildtoo - 21.7.2009, 12:00 |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вот это
Вариант
Что касается
Это сообщение отредактировал(а) xvr - 21.7.2009, 12:09 |
||||||
|
|||||||
| wrathchildtoo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
Всем спасибо.
|
|||
|
||||
| wrathchildtoo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.4.2009 Репутация: нет Всего: нет |
Вот что по этому поводу говорит сам создатель C++ Бьярне Страуступ:
http://www.research.att.com/~bs/bs_faq2.ht...valuation-order |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Что ты тут подразумеваешь под UB, и при чём тут sequence point? Это сообщение отредактировал(а) UnrealMan - 24.7.2009, 18:00 |
||||
|
|||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вот это
Похоже я не прав - sequence point тут вроде есть - вызов функции (operator<<). Так что UB тут нет
Это сообщение отредактировал(а) xvr - 24.7.2009, 18:21 |
||||||||||||
|
|||||||||||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |