Общее
В C порядок любой операции между двумя точками последовательности не должен зависеть от.Я не помню точную формулировку из стандарта, но именно по этой причине
i = i++;
является неопределенным поведением.Стандарт определяет список вещей, составляющий sequence points
, из памяти это
- точка с запятой после оператора
- оператор запятой
- оценка всехАргументы функции перед вызовом функции
- && и ||операнд
Просматривая страницу в википедии, списки более полны и описывают более подробно.Очки последовательности - чрезвычайно важная концепция в Си, и если вы еще не знаете, что это значит, изучите ее немедленно.
Конкретный
Независимо от того, насколько четко определен порядок оценки и присвоенияпеременные x
, y
и z
, для
x[--i] = y[++i] = z[i++];
это утверждение не может быть ничем иным, как неопределенным поведением из-за i--
, i++
и i++
.С другой стороны,
x[i] = y[i] = z[i];
четко определено, но я не уверен, какой статус для порядка оценки для этого.Однако, если это важно, я бы предпочел, чтобы это было разделено на два утверждения вместе с комментарием «Важно, чтобы ... был назначен / инициализирован до ... потому что ...».