2012-11-01 91 views
1

我的代碼中存在導致運行時錯誤的問題。調試我在一些cout語句中拋出的代碼,以查找代碼正確執行的最後一個位置。根據輸出,當while條件評估爲false時,它看起來像while語句中斷,但我看不到這是可能的。下面的代碼:C++雖然循環不會在假狀態下退出

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

@casperOne嘿,請不要冒犯,但我在這裏學習繩索,我不確定你爲什麼認爲我的問題「不真實」。這個問題在發佈之前我曾經追蹤過幾個小時,「爲什麼我的while循環在評估結果爲false時不會退出」,網絡上沒有人說:「再看一眼你如何調試;具體看一下在你如何產生你的輸出「​​這真的是我正在尋找的答案。 - 關於這個問題的「含糊,模糊,不完整,過於寬泛或修辭」是什麼,爲什麼它「目前的形式不能合理地回答」? – Wadsworth

回答

3

while循環在假條件下退出。我沒有正確調試,這讓我專注於代碼的錯誤部分。

問題實際上是在最後一個cout後發生的。之後的聲明if(opStack.top()[1] == 'L'){嘗試從空堆棧中獲取頂層項目並導致運行失敗。

但是這怎麼可能呢,因爲我們從來沒有在輸出中看到「使用while循環」?這是因爲在程序崩潰之前,最後一個cout沒有被刷新到輸出。我將<<endl添加到最後一個cout,並且這個技巧。 「顯示出while循環」並且我能夠在程序中查明真正的問題。

感謝(通過把最後的if-else語句中if(opStack.empty()==false){//second if-else set}解決吧)@interjay用於指出COUT沒有得到我原來的,但格式混亂的問題通紅:c++ while loop condition isn't playing nice with stack.empty()

+0

先生,這讓我困了幾天。非常高興你找到答案。 – WhozCraig

+0

我也是如此。這對我來說也是幾天完全的惡化。感謝善良的好人在堆棧溢出:) – Wadsworth

+0

而且,教訓是總是使用'cerr'進行調試,因爲它沒有被緩衝! –