Задачка с инкрементом
i= ++i + ++i;
i == 14;
Если так:
i= i++ + ++i;
i == 13; - ну это понятно
Просто не пиши так и не надо будет думать почему оно сейчас так, а при других условиях (а возможно компиляторе, ОС и т.п.) ведет себя по другому.
затем следующие 4 плюса относит ко второму (++++i) и складывает их.
Получается так:
(5 + 7) + 1
Вот и выходит 13
Во вторых, не советую в одном выражении более одного раза изменять значение одной переменной, порядок в котором она будет менятся будет определятся не тобой а компилятором. _aks_ уже достаточно толково объяснил.
затем следующие 4 плюса относит ко второму (++++i) и складывает их.
Получается так:
(5 + 7) + 1
Вот и выходит 13
ИМХО не стоит искать причины тому, что не возьмутся обьяснять разработчики компиляторов. Нет, РАЗУМЕЕТСЯ, зная результат выполнения в конкретной среде обьяснение найти возможно, но безсмысленно.
Просто, как уже было отмечено выше, не надо ТАК писать и все дела.
З.Ы. киньте кто-нибудь этот прикол в ФАКи, уже в шестой раз вижу подобный топик :)
Предлагаю вот эту ссылку
С этим несогласен в данном случае - поставил в приведённом примере скобки - результат тот же.
Во вторых, не советую в одном выражении более одного раза изменять значение одной переменной, порядок в котором она будет менятся будет определятся не тобой а компилятором. _aks_ уже достаточно толково объяснил.
С этим согласен. Вообще я когда то пробывал скомпилировать следующее (если я правильно вспомнил)
i = ++(i++);
Так вот в GCC это дело скомпилилось и даже как то работало,
а вот Builder сказал что LValue Required
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++.
Господа професионалы я правильно розмышляю ?
Почитай предыдущие сообщения прежде, чем постить свои.
Почитай предыдущие сообщения прежде, чем постить свои.
Буду спорить.
В первом варианте
14 ето 7 + 7, а 7 ето значение переменной i после двух префиксных икрементов, которые выполнились первыми.
Относительно второго варианта - мой експеримент
r = i++ + ++i;
i = 7
r = 12
Смотря на пример автора понимаю, что ++ постфиксное выполняется уже после выполнения =
Речь шла не про именно этот пример, а про существование скобок и приоритетов.
Относительно второго варианта - мой експеримент...
В стандарте определено поведение undefined behavior для таких "экспериментов", что неограничевает фантазию разработчиков компиляторов.
Тут спорить не буду, стандарта не читал.
Про такое поведение ++/-- читал в книге "С++ Полное руководство" (автора не помню, посмотрю и отредактирую пост).
Компилятор Турбо С++ 3 вдет себя именно так, по другому результаты автора обяснить не могу. (Помоему по другому и не получится.)
ЗЫ. Даже если бы в стандарте было прописано как такое должно работать, всеровно использовать не буду, потому что непонятно и не предсказуемо (ведь не все же компиляторы стандарт полностю поддержывают)
Лучше так не писать.