ISO/IEC 9899 (СК2) §6.5 - 2 Выражения говорит нам:Почему printf ("% d% d% d", ++ i, i, i ++) - неопределенное поведение?
между предыдущей и следующей точкой последовательности объект должен быть его сохраненное значение модифицированного не более одного раза по оценке выражения. Кроме того, предыдущее значение должно быть считано только для определения значения, которое необходимо сохранить.
Это то, что я имел в виду, помнил и сказал бы, что кто-нибудь спросит меня, почему строка из названия дает неожиданные результаты.
Но сегодня я только что обнаружил эту линию:
§7.19.6 - 1 отформатированные функции ввода/вывода:
отформатированные функции ввода/вывода должны вести себя так, как будто существует точка последовательности после того, как действия, связанные с каждым спецификатором.
Что заставило меня предположить:
Хотя
int i = 0;
printf ("%d, %d", ++i, i++);
должен быть определен, следующий пример должен быть в порядке по указанной статье:
int i = 0;
printf ("%d, %d, %d", ++i, i, i++);
Но выход есть:
2, 2, 0
Я никогда не видел лучшего примера, указывающего на неопределенное поведение.
Но почему? Если условие истинно
«[...] ведут себя так, как будто существует точка последовательности после действий, связанных с каждым спецификатором.»
затем применяя правило под §6.5 - 2 на каждый из actiosn, связанный с спецификатором не позволяет пересекать это правило, как в:
(ИП, представляющие собой соответствующую точку последовательности)
ИП ++i
ИП i
ИП i++
Начиная с SP1 в заданном диапазоне между предыдущим и следующим SP, ++i
является единственной модификацией сохраненного значения i
.
От SP2 что находится в диапазоне между предыдущим и следующим SP: ++i
и i
где ++i
все еще является единственной модификацией этого значения.
Если мы теперь возьмем SP3 все, что происходит между предыдущим SP (SP2) и следующий SP (конец вызова) является:
i
и i++
еще только одна модификация i
в целом диапазон между предыдущим и следующим SP.
Так что же я интерпретирую здесь неправильно о том, как работают точки последовательности?
Не стесняйтесь, если считаете, что это приемлемо. Но обратите внимание, что это не просто еще один вопрос о доме. Я столкнулся с чем-то, что мне показалось странным, и я немного успокоился, и я ясно дал понять, что это путаница и почему он отличается от других вопросов об этом. Если вы все еще думаете, что я что-то пропустил или не приложил усилий, пожалуйста, дайте мне знать, почему вы так думаете. – dhein