В общем случае C ++ позволяет вычислять операторы через запятую в любом порядке.
Если вы ссылаетесь на запятые между аргументами функции, это просто разделитель.
В вашем случае вы используете оператор запятой , и это вводит точку последовательности, которая гарантирует, что все побочные эффекты от левого операнда запятой установятся до оценки правого.
Так что да, это хорошо определено.
Из раздела 5.18 / 1 стандарта ISO C ++ 98:
Пара выражений, разделенныхзапятая вычисляется слева направо, а значение левого выражения отбрасывается.Стандартные преобразования lvalue-to-rvalue (4.1), массив-указатель (4.2) и функция-указатель (4.3) не применяются к левому выражению.Все побочные эффекты (1.9) левого выражения, за исключением уничтожения временных (12.2), выполняются до оценки правого выражения.Тип и значение результата - это тип и значение правого операнда;результатом является lvalue, если его правый операнд равен.