使用 cout 和 reverse_iterator 的 C++ 奇怪输出

标签 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。我想不通里面发生了什么。谁能帮帮我?

最佳答案

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

您刚刚进入Undefined Behaviors的世界和 sequence 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 是否会在第二个之前递增是未指定的。

请记住,后递增运算符返回迭代器的拷贝并递增原始迭代器。你在同一条语句中有两次,所以,你最有可能拥有的是 it 在首先取消引用最新拷贝之前递增两次,然后第二次取消引用前一个拷贝

另请参阅此 Stackoverflow 问题的漂亮答案 Undefined behavior and sequence points

关于使用 cout 和 reverse_iterator 的 C++ 奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518811/

相关文章:

动态大小的多维数组的 C++ 解决方法

c++ - 调用 GetProcAddress 返回的函数时出现持续访问错误

c++ - 需要帮助理解代码以计算设置为 1 的位

C++ Protobufs::如何使用 MergeFrom() 删除特定字段?

c++ - 如何找到套接字的IP地址c++/c

c++ - 有没有自动生成 doxygen 注释 block 的软件?

c++ - 为什么函数不是对象?

c++ - 我如何在代码中创建一个抽象类,让蓝图扩展它,并将该蓝图返回给代码进行实例化?

c++ - Catch-all 处理程序检测 C++ 中的子类异常

c++ - 错误 C2065 : 'IDD_ ' : undeclared identifier