Поведение не определено, поскольку в x = x ++
нет промежуточной точки последовательности, см., Например, FAQ C .
Стандарты в стороне (поскольку это не определено относительно стандарта), то, как он работает, это то, что я ожидал.
Мое правило гласит, что для строки с x++
, вы заменяете x++
на x
и ставите x += 1
в следующей строке (или в предыдущей для предварительного инкремента).
Следуя этому эмпирическому правилу, ваш код будет выглядеть так
#include <stdio.h>
int main()
{
int x = 10, y = 0;
x = x; // x: 10
x += 1; // x: 11
printf("x: %d\n", x);
y = x; // y: 11
x += 1; // x: 12
printf("y: %d\n", y);
}
В языке Си не определено, когда именно происходит post/pre-in/decrement. Таким образом, утверждения типа x = x++
плохо сформированы - избегайте их.
Когда у вас:
a = b++;
происходит то, что b сохраняется в a, а после выполнения присваивания b увеличивается на единицу. Так что если вы сделаете:
x = x ++;
и ранее x было 10, то произойдет то, что 10 будет сохранено в x, а после (до того, как будет выполнен printf) x увеличится на единицу до 11. Вот почему будет напечатано 11.