![]() |
|
Модераторы: bsa |
![]()
|
|
| kurtis |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
ну собсно вопрос возник из-за этой цитаты с бора http://bash.org.ru/quote/212679
Я совсем не понимаю как работает префиксный инкремент!!!=((
т.е. сначало делаем первый прединкример, и получаем значение И равное 6, а потом инкрементируем значение И еще на единицу, и по идее у нас должно получиться выражение 6+7=13, но получается что-то вроде 7+7. Ну ладно, тут я еще логику работы компилятора понять могу, т.е. суммируются все-таки значения переменной И, а в конце строки значение переменной И равно 7, но как-то это странно..... но если написать
то моя теория полностью рушится, т.к значение вместо ожидаемых 6+7+8=21 либо 8+8+8=24, мы получаем значение равное 22, а это на 1 больше чем в выражении 6+7+8=21!!!
и тут понятное дело много всего непонятного, мы получаем 31, что тоже на 1 больше чем выражение 6+7+8+9=30 !!! Что странно, мы всегда получаем значение на 1 больше чем по идее должны были. Результат работы программы
С умножением тоже как-то все не очень понятно
т.е. тут уже четко видно как эти числа получены: 1) 7 * 7 = 49 2) 7 * 7 * 8 = 392 3) 7 * 7 * 8 * 9 = 3528 По идее на месте первой "семерки" должна быть "шестерка", а ее нету!!! Собсно вопрос, что я неправильно делаю??? Спасибо за внимание!!!=))))
|
||||||||||||||
|
|||||||||||||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| qweqwe |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 31.1.2007 Репутация: нет Всего: 0 |
сначала вычисляются аргументы ф-ии, а потом сама ф-я
в данном случае, сначала вычисляется ++i, потом ++i а потом i+i , а i в этот момент = 7 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| kurtis |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
оно как бы да, но как бы нет, т.е. оно сначало вычислило ++и, потом ++и и потом ++и, а потом и+и+и, а и нас на тот момент было 8, т.е. в результате должно получится 24, а 24 не получается, получается 22 Добавлено через 14 минут и 19 секунд ДА! прошу прощения, действительно имеет место быть т.н. UB Попробовал другой компилятор, выдало
|
||||
|
|||||
| Zaff |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 13.1.2008 Репутация: нет Всего: нет |
Конечно все зависит от конкретного кодогенератора. Например, в MSVC++6 конструкция int i = 5; i = ++i + ++i; будет преоброзована в следующий код:
таким образом, мы получаем такую последовательность действий: i = (i + 1 + 1); i = i + i; Теперь подумаем, почему так? Все просто - вспоминаем про приоритеты операций:
Конструкция int i = 5; i = ++i + ++i + ++i; разворачивается в нижеследующую:
То есть, сначала складываются первые два инкремента, а затем происходит третья инкрементация и сложение с результатом. Следуя математической логике, помня о приоритетах операций, принятых в СИ, данное решение правильно, так же, как i = 5; i = i + i + i * i; (i = 35). Другие примеры работают по такой же логике. Замечено, что компилятор MSVC++ наиболее правильно работает с математикой. |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
Толку то? Результат всё равно не предсказуем. Закладываться на какое-то конкретное поведение компилятора глупо. Выход - не писать такие конструкции.
|
|||
|
||||
| Zaff |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 13.1.2008 Репутация: нет Всего: нет |
Daevaorn, ну вопрос звучал почему. Конечно, в реальных программах стоит использовать другие конструкции. В общем, как я говорю своим студентам - читаем С.Макконнела и проникаемся, проникаемся...
Это сообщение отредактировал(а) Zaff - 13.1.2008, 22:27 |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Zaff, надеюсь Вы сообщаете своим студентам о существовании Стандарта?
Добавлено через 1 минуту и 27 секунд
Не то что бы "стоит" - такие конструкции использовать вообще нельзя. Эти конструкции - ошибки, которые компилятор не в состоянии отследить на этапе компиляции. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]()
|
| Правила форума "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. |