Так работает постфиксное увеличение. Я продемонстрирую порядок операций с ассемблером и буду использовать регистры, чтобы избежать путаницы с временной переменной (которая на самом деле не существует).
Эти инструкции (приращение постфикса):
x = 0;
x = x++;
// x is still 0
перевести на:
mov eax, 0 ; x = 0
mov ebx, eax ; x assignment on the right-hand side
mov eax, ebx ; x = x
inc ebx ; x++
"x" был увеличен после присвоение было выполнено и, следовательно, значение никогда не менялось.
Теперь эти инструкции (приращение префикса):
x = 0;
x = ++x;
// x is now 1
перевести на:
mov eax, 0 ; x = 0
mov ebx, eax ; x assignment on the right-hand side
inc ebx ; ++x
mov eax, ebx ; x = x
«x» был увеличен до , назначение было выполнено и, следовательно, значение изменилось.
Это почти то, как каждый язык программирования справляется с этим. Это никак не связано с троичным оператором.