Постинкрементный оператор: неожиданное поведение [дубликат]

8
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Поведение не определено, поскольку в x = x ++ нет промежуточной точки последовательности, см., Например, FAQ C .

13
ответ дан 5 December 2019 в 08:22
поделиться

Стандарты в стороне (поскольку это не определено относительно стандарта), то, как он работает, это то, что я ожидал.

Мое правило гласит, что для строки с 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);
}
2
ответ дан 5 December 2019 в 08:22
поделиться

В языке Си не определено, когда именно происходит post/pre-in/decrement. Таким образом, утверждения типа x = x++ плохо сформированы - избегайте их.

4
ответ дан 5 December 2019 в 08:22
поделиться

Когда у вас:

a = b++;

происходит то, что b сохраняется в a, а после выполнения присваивания b увеличивается на единицу. Так что если вы сделаете:

x = x ++;

и ранее x было 10, то произойдет то, что 10 будет сохранено в x, а после (до того, как будет выполнен printf) x увеличится на единицу до 11. Вот почему будет напечатано 11.

1
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: