c语言 printf gcc和vs010输出不一样

3 #include
4
5 int main(void)
6 {
7 unsigned char b = 0;
8 unsigned char a = 0;
9 printf("%d\t%d\t%d\t%d\n",a,++a,++a,++a);
10 printf("%d\t%d\t%d\t%d\n",b,b++,b++,b++);
11 }

gcc输出:
3 3 2 1
3 2 1 0 //符合我们的逻辑
vs2010输出:
3 3 3 3 //为什么是3 3 3 3啊?
3 2 1 0

这个其实没啥好疑惑的,编译器实现不同吧,感觉不用深究,单步跟进去看下就行了

我猜
printf("%d\t%d\t%d\t%d\n",a,++a,++a,++a);被编译器处理成
++a;
++a;
++a
printf("%d\t%d\t%d\t%d\n",a,a,a,a);

printf("%d\t%d\t%d\t%d\n",b,b++,b++,b++);被处理成
unsigned char t0 = b++;
unsigned char t1 = b++;
unsigned char t2 = b++
printf("%d\t%d\t%d\t%d\n",b,t2,t1,t0);

++a是左值,b++是右值,应该是vs编译器对于左值参数做了优化,在计算参数的表达式后没有用临时变量代替其入栈,节约内存
纯属猜测

编译器不同,就像两个人想法都不一样了,结果怎么会一样呢