Указатель указателя до/после

Есть ли разница между двумя выражениями:

(*x)++

и

++(*x)

Я вижу, что оба этих утверждения заменяют содержимое (* x + 1) в * x. Но есть ли какие-то различия между ними?

Ответы

Ответ 1

Один увеличивает значения, хранящиеся в x, прежде чем он будет использоваться (pre), а другой - после его использования (post).

Также обратите внимание, что ++(*x) не совпадает с (*x + 1). Первое увеличивает значение и сохраняет его обратно, другое просто увеличивает значение.

Ответ 2

Скажем, значение, указанное x, равно 10 i: e (* x равно 10)

y = (*x)++;

вышеуказанный оператор будет выполнен как
1. y = * x
2. * x = * x + 1
поэтому y = 10 и * x равно 11

y = ++(*x);

вышеуказанный оператор будет выполнен как
1. * x = * x + 1
2. y = * x
поэтому y = 11 и * x равно 11

Ответ 3

(*x)++ оценивает значение *x; как побочный эффект, значение в *x будет увеличиваться на 1.

++(*x) оценивает значение *x + 1; как побочный эффект, значение в *x будет увеличиваться на 1.

Предполагая код:

int a = 5;
int *x = &a;

(*x)++ будет оцениваться до 5, а ++(*x) будет оцениваться до 6.

Обратите внимание, что побочный эффект не должен применяться сразу после оценки выражения; его нужно применять только до следующей точки последовательности.

Также обратите внимание, что круглые скобки имеют значение (*x)++; postfix ++ имеет более высокий приоритет, чем унарный *, поэтому *x++ будет анализироваться как *(x++); он по-прежнему оценивает значение *x, но по мере того, как побочный эффект продвигает указатель, а не увеличивает указатель на него. Префикс ++ и унарный * имеют одинаковый приоритет, поэтому они применяются слева направо; таким образом, ++(*x) и ++*x будут иметь одинаковый результат (*x получает приращение, а не x).

Ответ 4

Один из них - "pre", а другой - "post". Это различие. Один оценивается до инкремента (первый вариант), другой оценивается после приращения (второй вариант).