1 и 3 одинаковы.
Помните, что как постфиксные, так и унарные формы ++
и --
имеют результат и побочный эффект :
Результатом x++
является текущее значение x
- в качестве побочного эффекта x
увеличивается на 1 (если x
- указатель, этоувеличивается для указания на следующий объект в последовательности);
Результатом ++x
является текущее значение x
плюс 1 - какпобочный эффект, x
увеличивается на 1 (если x
- указатель, результатом является адрес следующего объекта в последовательности, а x
обновляется, чтобы указывать на следующий объект в последовательности);
Обе формы --
работают одинаково, за исключением того, что значение уменьшается на 1 - если это указатель, то он указывает на предыдущий объект в последовательности.
Когда вы бросаете разыменования указателя в микс, вы получаете следующее:
Выражение *p++
анализируется как *(p++)
(как и *(p)++
),Результатом *p++
является текущее значение *p
(значение вещи, на которую в данный момент указывает p
).Как побочный эффект, p
увеличивается для указания на следующий объект того же типа в последовательности (IOW, следующий элемент массива);
Выражение (*p)++
анализируется как написаноРезультатом (*p)++
является текущее значение *p
.Как побочный эффект, *p
увеличивается на 1. То есть обновляется значение объекта, на который указывает указатель, а не указатель.
Выражение ++*p
анализируется как ++(*p)
.Результатом ++*p
является текущее значение *p
плюс 1. В качестве побочного эффекта *p
увеличивается на 1.
Выражение *++p
анализируется как*(++p)
.Результатом *++p
является значение объекта , следующего за объектом, на который в данный момент указывает p
.В качестве побочного эффекта p
увеличивается, чтобы указывать на следующий объект.
Предполагается следующее объявление:
int a[] = {1, 2, 3, 4};
int *p = a;
После этих строк значениеp
- это &a[0]
.Таким образом, учитывая выражение
x = *p++;
результат из *p++
равен 1
(значение вещи p
в данный момент указывает на), которое присваивается x
.Побочный эффект заключается в том, что p
обновляется до значения a[1]
.
Затем мы выполняем
x = (*p)++;
Результат из (*p)++
- это значение вещи, на которую p
указывает в данный момент (если p
указывает на a[1]
, тогда значение равно 2
), которое присваивается x
.Как побочный эффект, вещь, на которую указывает p
, увеличивается (если p
указывает на a[1]
, то значение a[1]
теперь равно 3
).
Мы выполняем
x = ++*p;
Результатом ++*p
является значение вещи, p
указывает на плюс 1, и в результате вещь, на которую p
указывает, являетсяувеличивается (если p
указывает на a[1]
, то значение a[1] + 1
равно 4
, которое присваивается x
, а значение a[1]
теперь равно 4
).
Наконец, мы выполняем
x = *++p;
Результатом *++p
является значение объекта , следующего за объекта, на который в данный момент указывает p
, и p
увеличиваетсячтобы указать на этот объект (если p
указывает на a[1]
, то значение a[2]
(3
) записывается в x
, а p
обновляется, чтобы указывать на a[2]
).
Опять же, --
работает так же, только в другом направлении.