Проблема, с пониманием приоритета операций, при разыменовывании

Вопрос довольно глупый, но я никак не могу с ним разобраться, а chatGPT каждый раз противоречит сам себе, при ответе. Почему, при:

int array[4] = {1, 2, 3, 4};
int *p = array;
int x = (*p++)++;

Я получаю array[4] = {2,2,3,4} Ведь по логике унарных операторов, все должно читаться справа - налево. Вроде, у разыменования приоритет выше, но почему при записи int x = (*p++) происходит сначала сдвиг, а потом разыменование?


Ответы (2 шт):

Автор решения: Qwertiy

Ведь по логике унарных операторов, все должно читаться справа - налево

Но в выражении ведь скобки стоят.

происходит сначала сдвиг, а потом разыменование?

Неправда. В таком случае получилось бы {1,3,3,4}.

Я получаю array[4] = {2,2,3,4}

(*p++)++
  ^------------ взяли указатель p
   ^^---------- увеличили на 1
  ^^^---------- но продолжаем работать со старым значением
 ^------------- разыменовали - получилась 1 в нулевом элементе
^----^--------- скобки только для приоритета операций
      ^^------- увеличили на 1 (в массиве)
^^^^^^^^------- и вернули старое значение

Вот можно посмотреть ассемблерный код: https://godbolt.org/z/vMhaav1qe

скриншот asm

→ Ссылка
Автор решения: user7860670

происходит сначала сдвиг, а потом разыменование?

Правда. В обоих выражениях (*p++)++; и (*p++) сначала производится инкремент p++, и только затем разыменование, так как приоритет постфиксного инкремента выше. Важно, что новое значение указателя p в этих выражениях не используется, ведь постфиксный инкремент возвращает исходное значение операнда, поэтому изменяется только первый элемент массива.

→ Ссылка