Давайте посмотрим на IL, который генерируется из этого оператора
IL_0002: ldloc.0
Загружает значение x в стек. Стек => (4)
IL_0003: dup
Дублирует самый верхний элемент в стеке. Стек => (4, 4)
IL_0004: ldc.i4.1
Вставьте 1 в стек. Стек => (1, 4, 4)
IL_0005: sub
Вычтите два верхних значения и поместите результат в стек. Стек => (3, 4)
IL_0006: stloc.0
Сохранить самое верхнее значение стека обратно в x. Стек => (4)
IL_0007: ldloc.0
Загрузить значение x обратно в стек. Стек => (3, 4)
IL_0008: ldc.i4.1
Загрузить значение 1 в стек. Стек => (1, 3, 4)
IL_0009: sub
Вычтите два. Стек => (2, 4)
IL_000A: dup
Дублировать верхнее значение => (2, 2, 4)
IL_000B: stloc.0
Сохранить верхнее значение обратно в x. Стек => (2, 4)
IL_000C: sub
Вычтите два верхних значения. Стек => (2)
IL_000D: stloc.0
Сохраните это значение обратно в x. x == 2