Добрый день! Есть участок кода:
#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--), но это не так. Пожалуйста, подскажите, почему так происходит. Заранее спасибо.