Wie haggai_e angedeutet hat, werden die Parameter in dieser Reihenfolge ausgewertet: Mitte, links, rechts. Um zu verstehen, warum gerade diese Zahlen angezeigt werden, muss man verstehen, wie das Inkrement funktioniert.
a++ bedeutet "etwas mit a machen und es danach inkrementieren". ++a bedeutet "erst a inkrementieren, dann etwas mit dem neuen Wert tun".
In Ihrem Beispiel wertet printf zuerst a++ aus, liest 10 und druckt es aus und erhöht es erst dann auf 11. printf wertet dann ++a aus, erhöht es zuerst, liest 12 und druckt es aus. Die letzte Variable, die printf auswertet, wird so gelesen, wie sie ist (12), und wird unverändert ausgedruckt.
Obwohl sie in einer zufälligen Reihenfolge ausgewertet werden, werden sie in der Reihenfolge angezeigt, in der Sie sie genannt haben. Deshalb erhalten Sie 12 10 12 und nicht 10 12 12.