cout << a << a-- << endl;
переводится как:
cout.operator<<(a).operator<<(a--).operator<<(endl);
В таком случае язык не гарантирует, какой из аргументов будет оценен первым.Компилятор может свободно выбирать порядок оценки, который им подходит.Обратите внимание, что порядок вызова функции гарантирован, но не порядок вычисления аргументов функции.
Если вы можете использовать c ++ 17 , стандарт изменился для <<
оператор.Это гарантирует порядок оценки, который имеет смысл, и вы получите ожидаемый результат.