Указатель указателя до/после
Есть ли разница между двумя выражениями:
(*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". Это различие. Один оценивается до инкремента (первый вариант), другой оценивается после приращения (второй вариант).