Постфиксная операция унарного приращения на указателях - PullRequest
0 голосов
/ 18 марта 2019

Я недавно начал работать с C и Pointers . Существует концепция, которая смущает меня в отношении унарной операции приращения указателей.

int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;

Поскольку унарный оператор (++) имеет больший приоритет, чем оператор разыменования (*), я ставлю * pnum1 внутри брекетов. Я ожидаю увидеть результат ниже:

после: 3

Но это не увеличивает значение num1. Почему это так? Разве это не предполагало увеличить значение num1?

1 Ответ

6 голосов
/ 18 марта 2019

Это неопределенное поведение.Вы увеличиваете num1 (через (*pnum1)++), а затем присваиваете результат обратно num1.Порядок выполнения приращения и присвоения в этом случае не определен, поэтому он может получить старое значение num1, увеличить num1, а затем присвоить старое значение обратно num1, что, по-видимому, и есть у вашего компилятора

Если вместо этого вы попробуете num1 = num1++, ваш компилятор, вероятно, предупредит вас об этом.

Решение не состоит в том, чтобы делать такие вещи, так как это неопределенное поведение.

Найдите «точки последовательности» для получения дополнительной информации.

...