Я знаю, что есть много ответов, и один из них принят, но я все равно добавлю два цента для еще одной точки зрения.
Я знаю, что этот вопрос был на C #, но я предполагаю, что для чего-то вроде постфиксного оператора он не отличается от C:
int main(){
int x = 0;
while (x<1)
x = x++;
}
Сборка (да, я редактировал ее, чтобы сделать ее более читабельной), сгенерированная компилятором, показывает
...
mov -8(rbp), 0 ; x = 0
L1:
cmp -8(rbp), 1 ; if x >= 1,
jge L2 ; leave the loop
mov eax, -8(rbp) ; t1 = x
mov ecx, eax ; t2 = t1
add ecx, 1 ; t2 = t2 + 1
mov -8(rbp), ecx ; x = t2 (so x = x + 1 !)
mov -8(rbp), eax ; x = t1 (kidding, it's the original value again)
jmp L1
L2:
...
Эквивалентно, цикл выполняет что-то вроде:
t = x
x = x + 1
x = t
Примечание: включение любых оптимизаций дает некоторый результат сборки, подобный следующему:
...
L1:
jmp L1
...
он даже не запоминает значение, которое вы ему сказали, чтобы дать x!