Как обьяснить это выражение ++*P--?
Вопрос такой, мы знаем, что Р это поинтер на любую клетку в массиве
Нужно обьяснить значение этого выражения
++*P--;
Хочется сказать, что как будто сначала мы передвигаем поинтер на один вперед потом на один назад и как будто ничего не должно поменяться.
Но как то это было бы слишком просто.
Вопрос, верно я думаю или это не так?
Ответы (2 шт):
Смотрите приоритеты. Сначала однозначно постдекремент к адресу указателя, затем, на усмотрение компилятора, разыменование указателя и прединкремент или обратное.
Обрамите скобками необходимый порядок: ++(*P--);
Открываем таблицу приоритетов и видим, что постдекремент имеет больший приоритет, чем прединкремент, и чем разыменование.
Значит, сначала указатель 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
меняется и массив, и указатель - как предсказано...