Обяснение на изхода на C програма

Следната програма дава резултат:

hffltgpshfflt

Може ли някой да обясни това как приоритетът на операторите на операторите postfix++, prefix++ и dereference(*) решава този изход?

#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
comment


Отговори (1)


Лесно е, след като човек научи правилата за приоритет и асоциативност на операторите.

Вашият израз ++*ptr++ е еквивалентен на ++*(ptr++), който е еквивалентен на ++(*(ptr++)).

Така че редът на операциите е

  1. Операторът след нарастване (който връща старата стойност на указателя ptr)
  2. Дерефериране на указателя ptr (преди указателят да бъде увеличен)
  3. Увеличаването на префикса на резултата от дереференцията, увеличавайки стойността, към която сочи ptr, превръщайки напр. 'g' до 'h' и т.н.
  4. Указателят ptr се увеличава (всъщност част от стъпка 1)
person Some programmer dude    schedule 25.10.2015