Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задачка с инкрементом

17K
15 июня 2007 года
Roy
24 / / 04.06.2007
Почему:
 
Код:
i= 5;
i= ++i + ++i;
i == 14;

Если так:
 
Код:
i= 5;
i= i++ + ++i;
i == 13; - ну это понятно
240
15 июня 2007 года
aks
2.5K / / 14.07.2006
Это undefined behavior.
Просто не пиши так и не надо будет думать почему оно сейчас так, а при других условиях (а возможно компиляторе, ОС и т.п.) ведет себя по другому.
18K
23 июня 2007 года
Splanger
5 / / 20.09.2006
Потому-что компилятор относит первые два плюса к первому i (получаем i++),
затем следующие 4 плюса относит ко второму (++++i) и складывает их.

Получается так:
(5 + 7) + 1
Вот и выходит 13
361
23 июня 2007 года
Odissey_
661 / / 19.09.2006
Во первых, хочешь однозначности ставь порядок операций скобками.
Во вторых, не советую в одном выражении более одного раза изменять значение одной переменной, порядок в котором она будет менятся будет определятся не тобой а компилятором. _aks_ уже достаточно толково объяснил.
1.9K
23 июня 2007 года
InterWen
331 / / 16.09.2006
Цитата: Splanger
Потому-что компилятор относит первые два плюса к первому i (получаем i++),
затем следующие 4 плюса относит ко второму (++++i) и складывает их.

Получается так:
(5 + 7) + 1
Вот и выходит 13




ИМХО не стоит искать причины тому, что не возьмутся обьяснять разработчики компиляторов. Нет, РАЗУМЕЕТСЯ, зная результат выполнения в конкретной среде обьяснение найти возможно, но безсмысленно.
Просто, как уже было отмечено выше, не надо ТАК писать и все дела.

З.Ы. киньте кто-нибудь этот прикол в ФАКи, уже в шестой раз вижу подобный топик :)

263
25 июня 2007 года
koltaviy
816 / / 16.12.2004
В фак точно нужно кинуть!!
Предлагаю вот эту ссылку
9.3K
12 сентября 2007 года
iridum
175 / / 26.08.2007
Цитата: Odissey_
Во первых, хочешь однозначности ставь порядок операций скобками.



С этим несогласен в данном случае - поставил в приведённом примере скобки - результат тот же.

Цитата: Odissey_

Во вторых, не советую в одном выражении более одного раза изменять значение одной переменной, порядок в котором она будет менятся будет определятся не тобой а компилятором. _aks_ уже достаточно толково объяснил.



С этим согласен. Вообще я когда то пробывал скомпилировать следующее (если я правильно вспомнил)

 
Код:
int i = 1;
   i = ++(i++);

Так вот в GCC это дело скомпилилось и даже как то работало,
а вот Builder сказал что LValue Required
276
12 сентября 2007 года
Rebbit
1.1K / / 01.08.2005
Не то чтоб по правилам обясню, может меня потом кто поправит, но по моему примерно так.
i++ - результат - чило которое било в i
++i - результат - переменная i но увеличеная на 1
++ префиксное выполняется в первую очередь

Как щитается:

Первий вариант
++i первое // i = 6
++i второе // i = 7
дальше i + i = 7 + 7 = 14
Второй вариан
сначала
++i // i = 6
потом
i++ вернет 6
6 + i = 6 + 6 = 12 // оно же запишется в i
и только потом к i прибавится еще 1 в результате того что раньше было i++.
Господа професионалы я правильно розмышляю ?
3
12 сентября 2007 года
Green
4.8K / / 20.01.2000
Нет.
Почитай предыдущие сообщения прежде, чем постить свои.
276
13 сентября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Green
Нет.
Почитай предыдущие сообщения прежде, чем постить свои.


Буду спорить.
В первом варианте
14 ето 7 + 7, а 7 ето значение переменной i после двух префиксных икрементов, которые выполнились первыми.
Относительно второго варианта - мой експеримент

 
Код:
i = 5
r = i++ + ++i;
После етого
i = 7
r = 12
Смотря на пример автора понимаю, что ++ постфиксное выполняется уже после выполнения =
361
13 сентября 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
С этим несогласен в данном случае - поставил в приведённом примере скобки - результат тот же.


Речь шла не про именно этот пример, а про существование скобок и приоритетов.

Цитата:
...значение переменной i после двух префиксных икрементов, которые выполнились первыми.
Относительно второго варианта - мой експеримент...


В стандарте определено поведение undefined behavior для таких "экспериментов", что неограничевает фантазию разработчиков компиляторов.

276
13 сентября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Odissey_
В стандарте определено поведение undefined behavior для таких "экспериментов", что неограничевает фантазию разработчиков компиляторов.


Тут спорить не буду, стандарта не читал.
Про такое поведение ++/-- читал в книге "С++ Полное руководство" (автора не помню, посмотрю и отредактирую пост).
Компилятор Турбо С++ 3 вдет себя именно так, по другому результаты автора обяснить не могу. (Помоему по другому и не получится.)

ЗЫ. Даже если бы в стандарте было прописано как такое должно работать, всеровно использовать не буду, потому что непонятно и не предсказуемо (ведь не все же компиляторы стандарт полностю поддержывают)

31K
22 сентября 2007 года
jkmuf
6 / / 22.09.2007
Всё зависит от компайлера и как осуществляется оптимизация.
Лучше так не писать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог