奇怪的C ++堆栈空()错误

时间:2012-11-10 09:37:17

标签: c++ stl

我的程序崩溃,因为它到达stack.top()它不应该到达,因为堆栈是空的。 我有一个if检查那个:

    if(!st.empty());
        //do stuff

(我已初步化

stack<int> st;

)。

但是虽然我可以在调试中看到堆栈是空的,但它仍然在if! 我甚至写了这段代码:

    if(st.size()>0);
        cout<<st.size();

它打印0! 发生了什么,我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:17)

if语句后面的分号是问题

<强> BAD:

if(st.size()>0); // <-- this should not be here!!!!!!!!
    cout<<st.size();

正确改写:

if(st.size()>0) {
    cout<<st.size();
}

另外,正如@WhozCraig指出的那样,另一个声明也有分号!

<强> BAD:

if(!st.empty()); // <--BAD!
    //do stuff

不可

if(!st.empty()) {
    //do stuff
}

始终!! 使用括号分支(if,switch)和循环(for,while,do-while)!它回报很大! (更不用说,一个可爱的小猫每次都会死掉这样一个没有括号的块!)总是!!

例如,这可能会在调试中耗尽一天:

<强> BAD:

int i=0;
...
while(i++<1000);
    doStuff(i);

不可

int i=0;
...
while(i++<1000) {
    doStuff(i);
}

小心(正如@WhozCraig再次指出的那样)不能自动解决分号终止的分支和循环语句的问题,因为这是完全有效的语法:

if (condition);{ ...code... } 

或者

if (condition);
{ 
     ...code... 
} 

在我看来和经验(这是完全主观的!) - 因为我自己已经陷入了这个陷阱几次 - 我经历过这种情况,当我在上述陈述之后有大括号时,我从来没有犯过再次输入分号的错误。坚持这个惯例是一个银弹 - 对我来说,其他人也可以从中受益。此外,如果那里有分号,它会立即引起我的注意,只是通过观察,因为它是“不常见的字符模式”

答案 1 :(得分:8)

if中没有“if”,因为你的if只包含一个空语句:

if(!st.empty());
        //do stuff -- that's outside the if!!!!

(背景:语法为if (condition) blockblock是一个语句或一个语句块。;是一个空语句,因此if (...) ;表示“如果条件得到满足然后什么也不做“ - 这可能永远不会是你想到的。”

你应该写

if(!st.empty()) {
        //do stuff -- now it's inside!
}

小心!不要写

if(!st.empty()); // notice the semicolon making it wrong; without the semicolon it would be ok
{
        // outside again
}