Объяснение вывода программы C

Следующая программа дает вывод:

hffltgpshfflt

Может ли кто-нибудь объяснить, как приоритет операторов postfix++, prefix++ и разыменования (*) определяет этот вывод?

#include<stdio.h>
int main()
{
  char arr[]  = "geeksforgeeks";
  char *ptr  = arr;

  while(*ptr != '\0')
   ++*ptr++;
  printf("%s %s", arr, ptr);

  getchar();
  return 0;
}

person Tarun Bhargava    schedule 25.10.2015    source источник
comment
@JoachimPileborg хорошо, отозвав закрытое голосование здесь - вы правы в этом случае, префикс ++ привязывается к разыменованному ptr. Просто добавлю... на кой черт писать такой код? Но ладно, допустим, это лабораторный пример или что-то в этом роде...   -  person    schedule 25.10.2015
comment
@MartinJames: Не совсем...   -  person alk    schedule 25.10.2015
comment
Просто добавив, что мне действительно пришлось поставить скобки вручную (как это сделал Иоахим в своем ответе), чтобы понять, что это не то же самое место в памяти, измененное двумя ++ в этом примере. Это определенно код, который никто никогда не захочет видеть в продакшене. :)   -  person    schedule 25.10.2015


Ответы (1)


Это легко сделать, если вы изучите правила приоритета и ассоциативности операторов.

Ваше выражение ++*ptr++ эквивалентно ++*(ptr++), которое эквивалентно ++(*(ptr++)).

Итак, порядок действий

  1. Оператор постинкремента (который возвращает старое значение указателя ptr)
  2. Разыменование указателя ptr (до увеличения указателя)
  3. Префикс-инкремент результата разыменования, увеличивающий значение, на которое указывает ptr, превращая, например, с 'g' по 'h' и т. д.
  4. Указатель ptr увеличивается (фактически часть шага 1)
person Some programmer dude    schedule 25.10.2015