C++自增有关问题

C++自增问题
#include <iostream.h>
void main()
{
int a = 1;
int b = 1;

cout<<"(a++)+(a++)+(a++)="<<(a++)+(a++)+(a++)<<endl;
cout<<"(++b)+(++b)+(++b)="<<(++b)+(++b)+(++b)<<endl;

cout<<"b = "<<b<<endl;
cout<<"a = "<<a<<endl;
}

VC6.0结果:

(a++)+(a++)+(a++)=3
(++b)+(++b)+(++b)=10 // B
b=4
a=4

疑问:语句 B,结果为什么是10?

求答疑,谢谢!

------解决方案--------------------
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?33078

这叫行为未定义。
从某些角度,可以说:这种写法是错的。
------解决方案--------------------
曾经的月经贴啊。

作为标准控,我用c++标准回答你,,但要注意的是,vc6的实现非常不符合c++标准。

c++2011标准规定:

1)除非特殊说明,表达式的子表达式之间的运算顺序是未定的(unsequenced)。原话是:Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.

例如: (a+b)*(c+d),为了计算乘法,必须知道a+b或者c+d的值,但是a+b的运算,和c+d的运算之间的顺序是未定的。

2)如果2处运算都涉及同一个变量,最少其中一个是修改这个变量的值(另一个是写入或者读取),并且这2处运算的顺序是未定的,那么对不起,你就涉及到了c/c++中最邪恶的未定义行为(undefined behaviour)。

原文是:If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

你的例子:
(a++)+(a++)+(a++),明显的3处都修改同一个变量a,并且3处顺序未定,该行为未定义,即编译器即使返回10000或者-10000都是可能的。

(++b)+(++b)+(++b)同理,未定义行为。

总结:一切未定义行为都是邪恶的。不要写出任何未定义的源代码。因为一段代码如果未定义,程序结果就可能未定义,该程序就是无用的。

------解决方案--------------------
cout<<"(a++)+(a++)+(a++)="<<(a++)+(a++)+(a++)<<endl;
cout<<"(++b)+(++b)+(++b)="<<(++b)+(++b)+(++b)<<endl;

这条语句是应试教育的产物,是素质教育的大敌。。。。