今天听同学提起一个问题,在C++中运行下面的语句会得到什么结果:
1 int a = 0; 2 cout << a++ << a++ << a++;
起初我个人想当然地认为会输出012,然而在VS中测试过后得到的结果是210,刚好相反。百度过后得到的解释是cout的压栈顺序是从右到左,所以编译器最先处理最右边的a++,求值为0然后自增,接着处理中间的a++,求值为1,自增,然后最后才是最左边的a++,求值为2,然后自增。然后从左向右依次输出,所以结果为210。
但是本着网上说的未必正确的想法,翻阅了《C++ Primer》,上面说的很明白:对于没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为,比如<<运算符没有明确规定何时以及如何对运算对象求值。因此上面的输出表达式是未定义,无法推断它的行为,结果可能是210,也可能是012,甚至编译器还可能做完全不同的操作。测试会输出210只是因为使用的编译器是使用网上所说的执行顺序。