我的程序崩溃,因为它到达stack.top()它不应该到达,因为堆栈是空的。 我有一个if检查那个:
if(!st.empty());
//do stuff
(我已初步化
stack<int> st;
)。
但是虽然我可以在调试中看到堆栈是空的,但它仍然在if! 我甚至写了这段代码:
if(st.size()>0);
cout<<st.size();
它打印0! 发生了什么,我该如何解决?谢谢!
答案 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) block
,block
是一个语句或一个语句块。;
是一个空语句,因此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
}