带有cout和reverse_iterator的C ++奇怪输出

时间:2016-02-20 03:36:05

标签: c++

当我尝试使用vector< reverse_iterator进行遍历时,我在C ++中发现了一个非常奇怪的输出。我的代码很简单,就像这样:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    vector<int>::reverse_iterator it = v.rbegin();
    cout << *it++ << " " << *it++;
    return 0;
}

输出为2 3.我无法弄清楚其中发生了什么。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:6)

我不知道你做C ++多久了,但是再次欢迎使用C ++ :-) ...

您刚刚进入了Undefined Behaviorssequence points

的世界

您应该将代码分解为:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    vector<int>::reverse_iterator it = v.rbegin();
    cout << *it;
    it++; 
    cout << " " << *it;
    return 0;
}

现在有效......: - )

让我解释一下,简要概述原始代码中发生的事情......

这一行

cout << *it++ << " " << *it++;

第一个it是否会在第二个未指定之前递增。

请记住,post-increment运算符返回迭代器的副本并递增原始迭代器。你在同一个语句中有两次,所以,你最有可能的是it在最先复制一个最新副本之前增加了两次,然后前一个副本被解除引用第二个

另请参阅Stackoverflow问题的精美答案  Undefined behavior and sequence points