非常奇怪的挂起for循环初始化

时间:2011-08-11 21:57:30

标签: c++ vector for-loop iterator

我有一个非常奇怪的错误,我似乎无法弄明白。我把它缩小到一小部分代码(除非编译器重新排序我的陈述,我不相信这是真的)。​​

...
std::cout << "here"<< std::endl;
std::vector<int>::iterator n_iter;
std::vector<int>::iterator l_iter;
std::cout << "here?" << std::endl;
for(n_iter = n.begin(), std::cout << "not here" ; std::cout << "or here" && n_iter < n.end(); n_iter++)
{
    std::cout << "do i get to the n loop?";
    ...
}

当我运行它时,我看到第一个“这里”,第二个“这里?”,但我没有得到“不在这里”或“或在这里”输出。而且我绝对不会得到“我能进入n循环吗?”。

奇怪的是我的程序正在运行(它几乎耗尽了整个cpu核心...),但它没有完成,它只是挂起。

我尝试过使用clang ++和g ++,我没有使用任何优化。我安装了boost库(并使用了boost_program_options部分)和armadillo。但我不认为编译器应该重新排序......

在for循环声明中有或没有cout调用时会发生这种情况,并且它不会跳过循环。

向量“n”的长度至少为1,由boost_program_options调用给出。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该尝试的第一件事是在每个字符串后输出std::endl。这会刷新输出缓冲区。

答案 1 :(得分:2)

以下程序(其中有一些额外的换行符没有):

#include <string>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> n;
    n.push_back(3);
    n.push_back(3);
    n.push_back(3);

    std::cout << "here"<< std::endl;
    std::vector<int>::iterator n_iter;
    std::vector<int>::iterator l_iter;
    std::cout << "here?" << std::endl;

    for(n_iter = n.begin(), std::cout << "not here\n" ; std::cout << "or here\n" && n_iter < n.end(); n_iter++)
    {
        std::cout << "do i get to the n loop?\n";
    }
}

具有以下输出:

[5:02pm][wlynch@orange /tmp] make foo
g++     foo.cc   -o foo
[5:02pm][wlynch@orange /tmp] ./foo
here
here?
not here
or here
do i get to the n loop?
or here
do i get to the n loop?
or here
do i get to the n loop?
or here

这似乎是您所期望的,因此我不确定您在哪里遇到问题,但可能是跳过的代码。