请教++i和i++,以及printf,真是难搞啊

请问++i和i++,以及printf,真是难搞啊!
一道华为的笔试题:
设int   arr[]={6,7,8,9,10};
          int   *ptr=arr;
      *(ptr++)+=123;
  printf("%d,%d",*ptr,*(++ptr));

我在网上查的答案是:
对于*(ptr++)+=123;先做加法6+123,然后++,指针指向7;对于printf(“   %d   %d   ”,   *ptr,   *(++ptr));从后往前执行,指针先++,指向8,然后输出8,紧接着再输出8


1,*(ptr++)+=123;不是等于*(ptr++)=*(ptr++)+123,那在这个式子里,ptr只加了一次,我想问下,如果在一个等式里i++出现了很多次,最后i只加一次还是出现几次加几次?
2.我一直以为printf的参数输出是从前往后执行的,看答案才知道相反,但我在查的时候在一个帖子里看到:
------------------------------

刚才我编了个测试程序,如下:

/**   test_pr.c
    *   运行环境:Microsoft   Window   2000   Pro   +   mingw
    *   编译器:GNU   gcc
    *
    *   Cheyenne
    */
#include   <stdio.h>
main()   {
    int   i;
    i=1;
    printf( "%d,   %d,   %d\n ",   i,   i++,   i++);
}

这个程序希望输出   1,2,3,但是实际上它输出的是   3,2,1。现在我把汇编代码给写出来,你一看就会明白是为什么了:
---------------------
我运行了一下,输出的却是1,1,1
从前往后执行应该是1,1,2吧,从后往前3,2,1,怎么会是1,1,1?实在是迷茫,怎么回事啊?




------解决方案--------------------
如果考i++和++i的话,虽然够恶心,也基本说的过去

如果再考到底是从前还是从后执行,那就是变态,白痴,蠢货

------解决方案--------------------
这种问题真的没有必要深究!!!
------解决方案--------------------
这个与编译环境有关,打开编译选项/Gd

------解决方案--------------------
我在这里更新一下认识.
printf并不是从左或者从右处理的.
我使用vs2005,clr console program.
下面语句:
printf("%d,%d",*ptr,*(++ptr));
printf("%d,%d",*(++)ptr,*(ptr));
输出都是8,8;

printf("%d,%d",*ptr,*(ptr++));
printf("%d,%d",*(ptr++),*(ptr));
输出都是7,7.
说明:
如果++在左(++i),printf先执行++i,然后printf( "%d ",*i);
如果在右(i++),则printf( "%d ",*i),然后i++.
上面的*(ptr++)+=123;结果是6+123=129,此时*prt=7.
这些都运行测试过.
------解决方案--------------------
研究这些问题毫无意义,真正要做的是在编程时避免这种垃圾代码,因为不同的编译器会有不同的行为。