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

时间:2012-11-01 21:05:06

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

我的代码中存在导致运行时错误的问题。为了调试代码,我在一些cout语句中抛出代码来查找代码正确执行的最后位置。基于输出,当while条件的计算结果为false时,看起来while语句会中断,但我看不出这是怎么回事。这是代码:

var声明:

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循环条件为false,但程序在while循环退出之前失败。怎么可能呢?它与堆栈的工作方式有关吗?

1 个答案:

答案 0 :(得分:3)

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

问题实际上是在最后一次cout之后发生的事情。之后的语句if(opStack.top()[1] == 'L'){尝试从空堆栈中获取最高项并导致运行失败。

但是这怎么可能,因为我们从来没有在输出中看到“使它脱离了while循环”?这是因为在程序崩溃之前,最后一个cout没有被刷新到输出。我向最后一个cout添加了<<endl,这就是诀窍。 “显示出了while while循环”,我能够确定程序中的真正问题。 (通过将最后一个if-else语句放在if(opStack.empty()==false){//second if-else set}

中来解决它

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