Одной из целей разработки C / C ++ является эффективная реализация для компиляторов. Таким образом, компиляторам предоставляется относительно свободная возможность выбора порядка вычисления различных подвыражений в сложном выражении; этот порядок не ограничен приоритетами операторов и ассоциативностью, как мы думаем. В такой ситуации, когда мы модифицируем один и тот же vairiable в нескольких подвыражениях, поведение становится неопределенным. Операция увеличения или уменьшения не гарантируется, что она будет выполнена сразу же после отказа от предыдущего значения и до того, как любая другая часть выражения будет оценена. Единственная гарантия состоит в том, что обновление будет выполнено до того, как выражение будет считаться завершенным.
Неопределенное поведение означает неопределенное, и может произойти все, что угодно .
Источник: FAQ по программированию на С, автор Steve Summit