Как обьяснить это выражение ++*P--?

Вопрос такой, мы знаем, что Р это поинтер на любую клетку в массиве

Нужно обьяснить значение этого выражения

++*P--;

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

Но как то это было бы слишком просто.

Вопрос, верно я думаю или это не так?


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

Автор решения: Spaghetti Man

Смотрите приоритеты. Сначала однозначно постдекремент к адресу указателя, затем, на усмотрение компилятора, разыменование указателя и прединкремент или обратное. Обрамите скобками необходимый порядок: ++(*P--);

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

Открываем таблицу приоритетов и видим, что постдекремент имеет больший приоритет, чем прединкремент, и чем разыменование.

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

Почему сначала разыменовано, а потом ++, если их приоритеты одинаковы? Потому что унарные операторы правоассоциативны, т.е. выполняются справа налево. Никакого "на усмотрение компилятора" тут нет...

int main(int argc, const char * argv[])
{
    int a[5] = { 0, 2, 4, 6, 8 };
    int * p = a + 2;

    for(int i: a) cout << i << "  "; cout << endl;
    cout << ++*p-- << endl;
    for(int i: a) cout << i << "  "; cout << endl;
    cout << ++*p-- << endl;
    for(int i: a) cout << i << "  "; cout << endl;
}

Как видно по выводу

0  2  4  6  8  
5
0  2  5  6  8  
3
0  3  5  6  8  

меняется и массив, и указатель - как предсказано...

→ Ссылка