Старшинство и ассоциативность префикса и постфикса в c

int main()
{
  char arr[]  = "geeksforgeeks";
  char *ptr  = arr;

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

  getchar();
  return 0;
}

Оператор внутри цикла while ++ptr++ ведет себя таким образом, что я не понимаю. Постинкремент должен был быть оценен первым из-за его высокого приоритета, и первое выходное значение должно было быть f (с приращением e). Но этого не происходит. Чтобы понять, я изменил утверждение на ++*(ptr++), так что он может дать результат, который я ожидаю (ffltgpshfflt - это результат, который я ожидал; но фактический результат hffltgpshfflt). Но все равно выход не меняется. Оператор () имеет более высокий приоритет, чем преинкремент. Но почему выход не меняется?

1 ответ

У нас есть:

++*ptr++

Во-первых, оператор постфикса применяется, как вы сказали. Однако согласно определению оператора приращения постфикса, ptr++ оценивает ptr и увеличивается ptr от 1, Выражение оценивается не для увеличенного значения, а для исходного значения.

Так *(ptr++) оценивается в то же значение, что и *ptr Бывший также увеличивается ptr, Следовательно, первый элемент в массиве модифицируется при первом проходе алгоритма.

Скобки не имеют значения, потому что приращение постфикса уже имеет приоритет.

Если вы замените это на:

++*++ptr

ты получаешь

gffltgpshfflt

где порядок выполнения операторов одинаков; разница в том, что префикс ++ работает не так как postfix ++ - оценивается в увеличенную стоимость. Обратите внимание, что это также портит нулевой терминатор, так как ptr модифицируется перед проверкой на равенство 0,

Другие вопросы по тегам