这段代码的输出实在不理解。该如何处理

这段代码的输出实在不理解。。。
#include   <stdio.h>

int   main(void)
{
    int   arr[]={1,2};
int   *ptr=arr;
*(ptr++)=3;
printf( "%d,%d ",arr[0],arr[1]);
    return   0;
}

output:3,2
但是我觉得应该是1,3啊,主要是这一行 "*(ptr++)=3; ",我觉得应该是按照优先级先执行括号里面的 "ptr++ ",这样就使ptr指向第二个元素,然后给第二个元素赋值为3;
请教高手我的理解哪里不对?

------解决方案--------------------
; ",我觉得应该是按照优先级先执行括号里面的 "ptr++ ",这样就使ptr指向第二个元素,
------------------

按照优先级先执行括号里面的 "ptr++ ",---对,

不过交出来的结果是ptr,这个结果使用完后,ptr再自加。

lz可以自己写个小程序测试下。

printf( "%d ",*ptr++);
------解决方案--------------------
*(ptr++)=3; ==> *(++ptr) = 3;
------解决方案--------------------
先执行*ptr = 3后再自加的
------解决方案--------------------
x++ 先取值,再自加
++x 先自加,再取值
------解决方案--------------------
3,2应该没错啊

*(ptr++)先取值相当于*ptr
------解决方案--------------------
先说语法,后置的++运算符优先级高于间接运算符*,所以*p++等价于*(p++)。

再说语义,后置的++运算符,得到的子表达式的值(计算后返回的值)等于未自增前变量的值。所以你这里的问题只是返回值的问题。

最后纠正一个观念:++运算符在前在后的区别,只是它的返回值是自增后的值还是自增前的值的区别,但并没有一定的谁先运算谁后计算的区别。在编译器生成的机器代码中,像a = *p++完全有可能被解释为a = *p; p++的顺序,而不一定解释为tmp = p; p++; a = *tmp;这样的顺序(后者更低效)。这一点在一些隐匿的语法语义问题上会产生迷惑,因此最好避免使用有副作用的表达式。