相同的代码,不同编译器下结果不同,究竟哪个是正确的?该如何处理

相同的代码,不同编译器下结果不同,究竟哪个是正确的?
代码如下:
  #include<stdio.h>
   
  void fun(int i,int n);
   
  main( ){  
short x=5,y,z; 
  printf("+1 after use:\ny=%d\n",y=x++*x++); 
  printf("x=%d\n",x); 
  x=5;
  printf("+1 before use:\nz=%d\n",z=++x*++x); 
  printf("x=%d\n",x); 
 
int m=6;
m+=m-=m*m;
printf("m=%d\n",m);
 
int i=0;
  fun(i++,i++);
  } 
 
  
  void fun(int i,int n){
 
  printf("%d\t%d\n",i,n);
  }
这段代码,我分别用VC6.0、C-Free5、LCC-Win32及LabWindows/CVI四种编译器编译并运行,编译都没有问题,运行结果如下:
1,VC6.0:
  +1 after use:
  y=25
  x=7
  +1 before use:
  Z=42
  x=7
  m=-60
  0 0

2, C-Free5
  +1 after use:
  y=30
  x=7
  +1 before use:
  Z=42
  x=7
  m=-60
  1 0

3, LCC-Win32
  +1 after use:
  y=30
  x=7
  +1 before use:
  Z=42
  x=7
  m=-24
  1 0

4, LabWindows/CVI
  +1 after use:
  y=30
  x=7
  +1 before use:
  Z=42
  x=7
  m=-24
  1 0

请各位高手帮忙详细解答下,谢谢!

------解决方案--------------------
看到你这问题,还真不好回答,,其实,每种编译器的语法分析都有一些差别,你只能说在标准ANSI C 的编译下会是那种结果。如果是标准ANSI C 下来说,LCC是对的。因为我没太仔细看,我只是记得好像LCC的编译器是完全符合C99规范。所以我说LCC。2,4两种编译器没怎么使过。
------解决方案--------------------
未定义行为,不同编译器对其有不同的处理,结果不同属于正常现象,这个没有所谓的谁对谁错。
建议:不要写连自己都无法预测结果的代码
看看这个:http://www.c-faq.com/expr/index.html
------解决方案--------------------
http://topic.****.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?24709
------解决方案--------------------
都正确。

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!