Есть ли разница между этими двумя выражениями:пре/пост инкремент указателя
(*x)++
и
++(*x)
я могу видеть, как из этих утверждений заменить содержимое (* х + 1) в *Икс. Но есть ли какие-то различия между ними?
Есть ли разница между этими двумя выражениями:пре/пост инкремент указателя
(*x)++
и
++(*x)
я могу видеть, как из этих утверждений заменить содержимое (* х + 1) в *Икс. Но есть ли какие-то различия между ними?
Одно приращение значения, хранящееся в x
перед тем он используется (предварительно), в то время как другие делают это после того, как она используется (запись).
Также обратите внимание, что ++(*x)
является не так же, как (*x + 1)
. Первое увеличивает значение и сохраняет его обратно, другое просто увеличивает значение.
@mikefisher А, в таком случае да, это то же самое. –
Первый вариант - «pre», а другой - «post». В этом разница. Один оценивается до приращения (первый вариант), другой оценивается после приращения (второй вариант).
Допустим, значение указываемого х равно 10 я: е (* х 10)
y = (*x)++;
приведенное выше утверждение будет выполняться как
1. у = * х
2. * х = х + * 1
так у = 10 * & х 11
y = ++(*x);
приведенное выше утверждение будет выполнено, как
1. * х = * х + 1
2. у = * х
так у = 11 * & х 11
(*x)++
оценивает к значению *x
; в качестве побочного эффекта с, значение в *x
будет увеличиваться на 1.
++(*x)
оценивает к значению *x
+ 1; в качестве побочного эффекта с, значение в *x
будет увеличиваться на 1.
Предполагая код:
int a = 5;
int *x = &a;
(*x)++
будет оценивать с 5
, в то время как ++(*x)
будет оценивать до 6.
Примечание что побочный эффект не должен применяться сразу после оценки выражения; его нужно применять только до следующей точки последовательности.
Также обратите внимание, что круглые скобки вопрос для (*x)++
; постфикс ++
имеет более высокий приоритет, чем унарный *
, поэтому *x++
будет разобран как *(x++)
; он по-прежнему оценивает значение *x
, но в качестве побочного эффекта продвигает указатель , вместо того чтобы увеличивать предмет, указывающий до. Префикс ++
и унарный *
имеют одинаковый приоритет, поэтому они применяются слева направо; таким образом, ++(*x)
и ++*x
будут иметь одинаковый результат (*x
получает приращение, а не x
).
Спасибо за упоминание важности круглых скобок .. :) –
Используйте их с printf .. – Krishnabhadra
Возможный дубликат [++ по разыменованному указателю в C?] (Http://stackoverflow.com/questions/859770/on-a-dereferenced-pointer-in-c) – dirkgently
@dirkgently Неверный дубликат (хотя я думаю, что там есть и настоящий дубликат этого вопроса). –