Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2012, 18:53   #1
Buserandi
 
Регистрация: 03.11.2010
Сообщений: 4
По умолчанию Постфиксный инкремент или влияние приоритетной таблицы

Доброго времени суток, уважаемые программисты.
Проблема в понимании следующего:
Есть кусочек кода:
Код:
   
int i=0;
Array[i++] = i;
Как известно, сначала происходит присваивание массиву 0-му элементу нуля, а в конце уже увеличивается значение i.
Не могу понять, увеличение происходит в конце, т.к. инкремент является постфиксным или потому что квадратные скобки имеют больший приоритет?
В общем, почему инкремент происходит в конце, не смотря на то, что в [] массива уже происходит инкремент?

Заранее спасибо.
Buserandi вне форума Ответить с цитированием
Старый 03.07.2012, 19:07   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

инкремент идет после использования переменной i.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2012, 19:09   #3
Buserandi
 
Регистрация: 03.11.2010
Сообщений: 4
По умолчанию

Ещё раз спасибо. А то уже запутался во всём.
Buserandi вне форума Ответить с цитированием
Старый 03.07.2012, 23:03   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
Array[i++] = i; // !!!
Инкремент вполне может быть после использования i в квадратных скобках, но до использования её после =. Тут вообще неопределённое поведение. Если переменная изменяется инкрементом, её нельзя использовать в других местах до точки следования.
http://www.open-std.org/jtc1/sc22/open/n2356/expr.html
Цитата:
4 Except where noted, the order of evaluation of operands of individual
operators and subexpressions of individual expressions, and the order
in which side effects take place, is unspecified. Between the previ-
ous and next sequence point a scalar object shall have its stored
value modified at most once by the evaluation of an expression. Fur-
thermore, the prior value shall be accessed only to determine the
value to be stored.
The requirements of this paragraph shall be met
for each allowable ordering of the subexpressions of a full expres-
sion; otherwise the behavior is undefined. [Example:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9

i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
--end example]
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
влияние масштаба шрифта Windows на вид формы ktb Microsoft Office Access 2 01.11.2011 14:00
инкремент и for ts-alan Общие вопросы C/C++ 6 25.08.2010 13:57
Постфиксный (стековый) калькулятор (РЕКУРСИЯ) killer007 Фриланс 4 03.06.2010 09:25
Инкремент и дикремент Golovastik Общие вопросы C/C++ 3 16.07.2009 13:39
Алгоритм Дейкстры поиска путей в графе. Как реализовать с помощью приоритетной очереди? Zefick Помощь студентам 0 04.06.2009 14:03