我的代码中存在导致运行时错误的问题。为了调试代码,我在一些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循环退出之前失败。怎么可能呢?它与堆栈的工作方式有关吗?
答案 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())