cout语句中的调用顺序说明,后缀vs前缀

时间:2011-03-05 15:41:13

标签: c++

当我打印出我的测试时,当我注意到实际值输出中出现意外情况时,我正在重载postfix和前缀++运算符并测试它们。例如,这是一个整数测试:

int i = 0;
cout << "before prefix: " << i << " prefixing.. " << ++i << " after prefix. " << i << endl;

在我看来,这应打印出"before prefix: 0 prefixing... 1 after prefix. 1"

令我沮丧的是,这会打印before prefix: 1 prefixing.. 1 after prefix. 1 为什么在通话开始时它已经1?好吧,也许它会在打印之前解析语句,并且在打印开始之前我会增加。

但后来我测试了后缀整数递增...

int i = 0;
cout << "before postfix: " << i << " postfixing.. " << i++ << " after postfix. " << i << endl;

before postfix: 1 postfixing.. 0 after postfix. 1

除了中间声明之外,增量发生在哪里?!这非常直观。有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:3)

在同一语句中读取和递增变量(或者,在技术上,在两个序列点之间,在这种情况下,分号)会导致undefined behaviour - 换句话说,编译器是允许做任何想做的事。