2

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

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

(我已经初始化

stack<int> st;

)。

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

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

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

4

2 回答 2

17

if 语句后的分号是问题

坏的:

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

正确重写:

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

此外,正如@WhozCraig 指出的那样,另一个语句也有一个分号!

坏的:

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

好的:

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

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

例如,这可能会在调试中扼杀一天:

坏的:

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

好的:

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

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

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

或者

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

但是在我的观点和经验中(这完全是主观的!) - 因为我自己已经陷入这个陷阱几次 - 我经历过当我在上述陈述之后有大括号时,我从来没有犯过错误再次输入分号。遵守这个约定是灵丹妙药——对我来说,其他人也可以从中受益。另外,如果那里有一个分号,只要看一眼,它就会立即引起我的注意,因为它是一种“不常见的字符模式”

于 2012-11-10T09:40:39.510 回答
8

没有“在 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
}
于 2012-11-10T09:40:48.873 回答