Чем объясняется вывод следующей программы на C?

Я наткнулся на следующий код на geeksquiz.com, но не мог понять, как выражения, включающие операторы префикса, постфикса и разыменования, оцениваются в C:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));

    for (i=0; i<5; i++)
         *(ptr + i) = i;

    printf("%d ", *ptr++);
    printf("%d ", (*ptr)++);
    printf("%d ", *ptr);
    printf("%d ", *++ptr);
    printf("%d ", ++*ptr);
    free(ptr);
    return 0;
}

Выход дается как:

0 1 2 2 3

Может кто-нибудь объяснить, как это вывод для приведенного выше кода?

1 ответ

Решение

Приоритет операторов в C можно найти здесь.

В вашем примере единственное выражение, где приоритет имеет значение, это:

*ptr++

Здесь, постфиксный оператор ++ имеет более высокий приоритет, поэтому он эквивалентен

*(ptr++)

В остальном нет никакой двусмысленности ((*ptr)++, *ptr, *++ptr а также ++*ptr. Вы, кажется, смущены семантикой префикса и постфикса ++ операторы. Помните, что иногда вы увеличиваете указатель, а другие - то, на что он указывает. Вот что происходит:

printf("%d ", *ptr++);   // Increment pointer, de-reference old value: 0
printf("%d ", (*ptr)++); // De-reference pointer, increment, yield old value
                         // Evaluates to 1, sets *ptr to 2
printf("%d ", *ptr);     // De-reference ptr, yields 2 (see above)
printf("%d ", *++ptr);   // Increment ptr, de-reference: 2
printf("%d ", ++*ptr);   // De-reference (2), increment result: 3 
Другие вопросы по тегам