2012-06-07 2 views
2

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

(*x)++ 

и

++(*x) 

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

+3

Используйте их с printf .. – Krishnabhadra

+0

Возможный дубликат [++ по разыменованному указателю в C?] (Http://stackoverflow.com/questions/859770/on-a-dereferenced-pointer-in-c) – dirkgently

+0

@dirkgently Неверный дубликат (хотя я думаю, что там есть и настоящий дубликат этого вопроса). –

ответ

2

Одно приращение значения, хранящееся в xперед тем он используется (предварительно), в то время как другие делают это после того, как она используется (запись).

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

+0

@mikefisher А, в таком случае да, это то же самое. –

1

Первый вариант - «pre», а другой - «post». В этом разница. Один оценивается до приращения (первый вариант), другой оценивается после приращения (второй вариант).

6

Допустим, значение указываемого х равно 10 я: е (* х 10)

y = (*x)++; 

приведенное выше утверждение будет выполняться как
1. у = * х
2. * х = х + * 1
так у = 10 * & х 11

y = ++(*x); 

приведенное выше утверждение будет выполнено, как
1. * х = * х + 1
2. у = * х
так у = 11 * & х 11

5

(*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).

+1

Спасибо за упоминание важности круглых скобок .. :) –

Смежные вопросы