c++ while循环不会在错误条件下退出

标签 c++ while-loop conditional-statements stack

<分区>

我的代码出现问题,导致运行时错误。为了调试代码,我加入了一些 cout 语句来找到代码正确执行的最后位置。根据输出,当 while 条件的计算结果为 false 时,while 语句似乎中断了,但我看不出这是怎么可能的。这是代码:

变量声明:

queue<string> newOrder;
stack< vector<char> > opStack;
char symbol;

发生填充堆栈和队列的事情,然后到达此代码:

while(opStack.empty()==false){
    if(opStack.top()[1] != 'L'){
        cout<<"is stack empty?:"<<opStack.empty()<<endl;
        symbol = opStack.top()[0];
        newOrder.push(symbol);
        opStack.pop();
        cout<<"popped stack;"<<endl;
        cout<<"is stack empty?:"<<opStack.empty()<<endl;
    }
    else{
        break;
    }
}
cout<<"made it out of while loop";

if(opStack.top()[1] == 'L'){    
   opStack.pop();
}
else{
   errorEncountered = true;
}

这是输出:

is stack empty?:0
popped stack;
is stack empty?:1
RUN FAILED (exit value 1, total time: 1s)

因此,根据输出,堆栈在循环结束时为空。这应该使 while 循环条件为假,但程序在 while 循环退出之前失败。这怎么可能?它与堆栈的工作方式有关吗?

最佳答案

while 循环会在 false 条件下退出。我没有正确调试,这让我专注于代码的错误部分。

问题实际上是在最后一次计算之后发生了什么。之后的声明,if(opStack.top()[1] == 'L'){ , 尝试从空堆栈中获取顶部项目并导致运行失败。

但这怎么可能,因为我们从未在输出中看到“从 while 循环中跳出”?这是因为在程序崩溃之前,最后一个 cout 从未刷新到输出。我添加了 <<endl到最后一次,这就成功了。显示“使其脱离 while 循环”,我能够查明程序中的真正问题。 (通过将最后一个 if-else 语句放在 if(opStack.empty()==false){//second if-else set} 中解决了这个问题)

感谢@interjay 指出 cout 在我原来但格式不正确的问题中没有被刷新:c++ while loop condition isn't playing nice with stack.empty() )

关于c++ while循环不会在错误条件下退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185457/

相关文章:

c - 条件操作是什么意思?

C++11/C++03 和 std::vector 线程安全

c++ - 交换和重新计算给出不同的结果

c++ - 派生类中的静态方法可以调用 C++ 中的 protected 构造函数吗?

java - 为什么这段代码会进入无限循环?

Java Date/Calendar 对象字符串,比较

c++ - 从哑指针 vector 切换到 boost::shared_ptr 时出现问题

java - 尝试使 while 循环正常工作

python - 列表和 While 循环

java - 如何在 Android 上向微调器添加条件