Как C обрабатывает приоритет операции в случае двух приращений и оператора косвенности? - PullRequest
2 голосов
/ 28 января 2020

Вчера я наткнулся на пример кода от лектора университета (я даю частные уроки одному из его учеников). Я пытаюсь понять, почему и как работает этот код, но я все еще не уверен, даже после нескольких часов исследований. Вот что у меня есть:

int tab[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int* t = tab;
int i;
for (i = 0; i < 10; i++)
{
    (*t++)++;
    printf("%d ", tab[i]);
};

Результат:

1 2 3 4 5 6 7 8 9 10

Итак, этот код довольно прост для понимания, за исключением этой части:

(*t++)++

Я знаю, что оператор инкремента имеет приоритет над оператором косвенности, поэтому эта операция, скорее всего, будет обрабатываться как:

(*(t++))++

Учитывая, что t является указателем, я бы сказал, что это произойдет:

  1. t адрес будет увеличен, поэтому он будет указывать на второй элемент в массиве tab (индекс 1).
  2. Теперь необходимо обработать оператор косвенности, поэтому значение второго элемента в массиве tab будет увеличен, потому что мы в итоге получим (*t)++.

Теперь мой вопрос: почему все элементы tab увеличиваются? Не следует ли пропустить первый элемент tab (индекс 0), учитывая, что увеличение указателя происходит прямо в начале l oop?

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Приоритет оператора говорит, что *t++ должен быть разложен как *(t++). Таким образом, выражение выглядит как (*t)++; t++;

Может возникнуть путаница, если вы не понимаете, что означает t++, значение этого выражения равно значению t до приращения, а t может наблюдаться как увеличенный после вычисления (целого) выражения.

0 голосов
/ 28 января 2020

Вы можете представить оценку этого выражения

(*t++)++;

как последовательность следующих операторов

int *tmp = t;
( *t )++;
++tmp;
t = tmp;

Из C стандарта (6.5.2.4 Постфиксный приращение и уменьшение операторы)

2 Результатом оператора post-x ++ является значение операнда. В качестве побочного эффекта увеличивается значение объекта операнда (то есть к нему добавляется значение 1 соответствующего типа).

...