Я не совсем уверен, что это за заказ. Это: 1) Разложите значение указателя p после его увеличения 2) Разверните значение указателя p перед его увеличением
Увеличивает ли * p ++ после разыменования?
Ответ 1
Нет никакого упорядочения между приращением и разыменованием. Однако оператор *
применяется к результату p++
, который является исходным значением p
до приращения.
Ответ 2
В таблице операторов показано, что оператор суффикса ++
имеет более высокое место, чем унарный оператор *
.
Следовательно, *p++
увеличивает p
(а не *p
) и возвращает значение, если адрес, который p
содержит перед приращением (так как это suffix ++
).
Но порядок зависит от реализации. Он может начинаться с разыменования p, а затем увеличивать его, и он может хранить старое значение p
, увеличивать его и затем разыгрывать старое значение.
Ответ 3
Учитывая q = *p++;
, q получает значение, указанное p перед приращением. Другой способ сказать, что значение выражения *p++
- это значение, указанное p, перед тем, как увеличиваться.
Ответ 4
Попробуйте. Программа
#include <stdio.h>
int main(void) {
int p[2];
int *q = p;
p[0] = 10;
p[1] = 100;
printf("%d\n", *q++);
printf("%d\n", *q);
return 0;
}
печатает
10
100
показывающий, что ++
применяется к p
, а не к *p
и что приращение происходит после разыменования.
EDIT: (Спасибо @EricLippert за то, что убедили меня вытащить K и R)
Не только может быть связь "после-после", но, согласно K и R стр. 203, должно быть:
Постфиксное выражение, за которым следует оператор ++ или -, является постфиксным выражением. Значение выражения выражения - это значение операнда. После того, как значение отмечено, операнд увеличивается (++) или уменьшается (-) на 1.
(акцент мой)
Конечно, я не считаю, что K и R ничего не говорят о семантике C в присутствии многопоточности (согласно Wikipedia спецификация pthreads была выпущена в 1995 году), но для однопоточной программы K и R довольно ясны.
Ответ 5
Постфикc++ и - операторы по существу имеют более высокий приоритет, чем префикс унарных операторов. Следовательно, * p ++ эквивалентно * (p ++); он увеличивает p и возвращает значение, на которое p указывал до того, как p был увеличен.
Чтобы увеличить значение, на которое указывает p, используйте (* p) ++ (или, возможно, ++ * p, если порядок оценки побочного эффекта не имеет значения).