我有一个非常奇怪的错误,我似乎无法弄明白。我把它缩小到一小部分代码(除非编译器重新排序我的陈述,我不相信这是真的)。
...
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调用给出。
有什么想法吗?
答案 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
这似乎是您所期望的,因此我不确定您在哪里遇到问题,但可能是跳过的代码。