c语言问题求解!关于y=(*--p)++

int a[]={5,8,7,6,2,7,3}; 
int y,*p=&a[1]; 
y=(*--p)++; 
printf("%d ",y); //y要在输出前自加吗?a[0]的数值为什么会发生变化呢?求解答🙏
printf("%d ",a[0]); 
return 0; 

y=(*--p)++;
相当于
p = p - 1;
(*p)++;
也就是
a[0]++;
y = a[0]++;,a[0]是5,所以y此时为5,然后因为++,a[0]为6

语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:

第1优先级:各种括号,如()、[]等、成员运算符 . ;

第2优先级:所有单目运算符,如++、–、!、~等;

第3优先级:乘法运算符*、除法运算符/、求余运算符%;

第4优先级:加法运算符+、减法运算符-;

第5优先级:移位运算符<<、>>;

第6优先级:大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=;

第7优先级:等于运算符==、不等于运算符!=;

第8优先级:按位与运算符&;

第9优先级:按位异或运算符^;

第10优先级:按位或运算符|;

第11优先级:逻辑与运算符&&;

第12优先级:逻辑或运算符||;

第13优先级:三目条件运算符 ?: ;

第14优先级:各种赋值运算符,如=、+=、-=、*=、/= 等;

第15优先级:逗号运算, 。

在C语言中,(*--p)++这个表达式的含义是:

  1. --p:将指针p向前移动一个元素。在你的代码中,p初始时指向a[1],执行--p后,p指向a[0]。

  2. *p:获取指针p当前指向的元素的值。在这个例子中,这将得到a[0]的值,即5。

  3. (*p)++:将指针p当前指向的元素的值自增1。在这个例子中,这将使a[0]的值变为6。

然而,这个自增操作是在赋值给y之后发生的,因为++是后置的。所以,y的值是自增前的值,即5。

所以,printf("%d ",y);将输出5,printf("%d ",a[0]);将输出6。

这就是为什么y在输出前不会自加,而a[0]的数值会发生变化的原因。