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