Увеличивает ли * p ++ после разыменования? - программирование
Подтвердить что ты не робот

Увеличивает ли * p ++ после разыменования?

Я не совсем уверен, что это за заказ. Это: 1) Разложите значение указателя p после его увеличения 2) Разверните значение указателя p перед его увеличением

4b9b3361

Ответ 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, если порядок оценки побочного эффекта не имеет значения).