Принятый ответ неверен. Это не тот случай, когда оператор постфикса ++
имеет тот же приоритет, что и разыменование / косвенное указание *
. Префиксный и постфиксный операторы имеют разный приоритет, и только оператор prefix имеет тот же приоритет, что и разыменование / косвенность.
Как показывает таблица приоритетов , постфикс ++
имеет более высокий приоритет , чем разыменование / косвенность *
. Таким образом, *ptr++
оценивается как *(ptr++)
. ptr++
соответствует текущему значению ptr
; увеличивается ptr
только как побочный эффект. Значение выражения совпадает с текущим значением ptr
. Так что это не повлияет на значение, хранящееся в указателе. Он просто разыменует указатель (то есть получает текущее значение, хранящееся там, которое составляет 19), а затем перемещает указатель. В вашем примере нет определенного значения, сохраненного в новой позиции ptr
, поэтому указатель указывает на мусор. Разыменование это сейчас было бы опасно.
Также, как показано в таблице, префикс ++
имеет тот же приоритет, что и разыменование / косвенное указание *
, но из-за ассоциативности справа налево он оценивается как ++(*ptr)
. Сначала будет разыменован указатель (то есть получено значение, сохраненное по указанному адресу), а затем увеличено это значение. Т.е. значение теперь будет 20.
Принятый ответ верен в отношении эффектов обоих, но действительный механизм отличается от того, который там дан.