Вы не можете полагаться на выходе этой программы, поскольку она является undefined behavior
, порядок вычисления не указан в C так, что позволяет компилятору оптимизировать лучше, из C99
проекта типового раздела 6.5
пункт 3
:
группировка операторов и операндов обозначается syntax.74) за исключением случаев, указанных позже (для вызова функции(), & &, ||,?:, и операторы запятой), порядок вычисления из подвыражения и порядок, в которых происходят побочные эффекты, являются как unsp ecified.
Это также не определено, потому что вы обращаетесь к стоимости k
и присвоение ему в том же sequence point
. Из проекта пункта стандартного раздела 6.5
2
:
между предыдущей и следующей точкой последовательности объект должен иметь хранимое значение модифицированного более одного раз по оценке выражения. Кроме того, предварительное значение должно быть считано только для определения значения, которое необходимо сохранить.
он приводит следующие примеры кода, как быть определено:
i = ++i + 1;
a[i++] = i;
Update
Был комментарий, чтобы ли запятые в вызове функции действовал в качестве точки последовательности или не. Если мы посмотрим на раздел 6.5.17 Comma operator
пункта 2
говорит:
Левый операнд оператора запятая оценивается как выражение недействительным; после оценки оценка .
, но пункт 3
говорит:
Пример Как указано в синтаксисе, оператор запятой (как описано в данном подпункте) не может появиться в контекстах, где запятая используется для разделения элементов в список (например, аргументы для функций или списки инициализаторов).
Таким образом, в этом случае запятая не вводит точку последовательности.
Это пример поведения 'undefined' –
Здесь приоритет оператора не имеет значения. – harold
на gcc версии 4.4.3 это '0 50 0', потому что это НЕОПРЕДЕЛЕННОЕ поведение :( –