Добрый день! Есть участок кода:
#include <stdio.h>
int x = 4, y = 2;
int a[5] = { 3, 2, 1 };
int f (int *p, int *q) {
    static int a = 3;
    if (--a)
        return *p-- += *q--;
    return *q++ -= *p++;
}
int main(void)
{
    int x = 2 * a[--y], b = 0;
    for (int y = x; y >= b; --y, ++x)
        b = f (a + y, a + b);
    printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
    printf( "%d %d\n", x, y);
}
*q-- рассматривается как (*q)--, а не как *(q--), во-первых, потому что *(q--), в моём представлении, дал бы a[-1] и сегфолт, во-вторых, потому, что я попробовал добавить перед этой строкой printf(«%d», *q--), и получил вполне себе int, и остальной вывод программы поменялся.
Я не могу понять, почему всё происходит именно так. Я просмотрел несколько разных источников. Одни говорят, что * и постфиксный декремент имеют одинаковый приоритет и ассоциируются справа налево, другие - что постфиксный декремент имеет более высокий приоритет, чем разыменование. В обоих случаях, как я понимаю, должно было бы произойти *(q--), но это не так. Пожалуйста, подскажите, почему так происходит. Заранее спасибо.



