Проблема, с пониманием приоритета операций, при разыменовывании
Вопрос довольно глупый, но я никак не могу с ним разобраться, а chatGPT каждый раз противоречит сам себе, при ответе. Почему, при:
int array[4] = {1, 2, 3, 4};
int *p = array;
int x = (*p++)++;
Я получаю array[4] = {2,2,3,4}
Ведь по логике унарных операторов, все должно читаться справа - налево. Вроде, у разыменования приоритет выше, но почему при записи int x = (*p++)
происходит сначала сдвиг, а потом разыменование?
Ответы (2 шт):
Ведь по логике унарных операторов, все должно читаться справа - налево
Но в выражении ведь скобки стоят.
происходит сначала сдвиг, а потом разыменование?
Неправда. В таком случае получилось бы {1,3,3,4}
.
Я получаю array[4] = {2,2,3,4}
(*p++)++
^------------ взяли указатель p
^^---------- увеличили на 1
^^^---------- но продолжаем работать со старым значением
^------------- разыменовали - получилась 1 в нулевом элементе
^----^--------- скобки только для приоритета операций
^^------- увеличили на 1 (в массиве)
^^^^^^^^------- и вернули старое значение
Вот можно посмотреть ассемблерный код: https://godbolt.org/z/vMhaav1qe
происходит сначала сдвиг, а потом разыменование?
Правда. В обоих выражениях (*p++)++;
и (*p++)
сначала производится инкремент p++
, и только затем разыменование, так как приоритет постфиксного инкремента выше. Важно, что новое значение указателя p
в этих выражениях не используется, ведь постфиксный инкремент возвращает исходное значение операнда, поэтому изменяется только первый элемент массива.