我的程序崩溃,因为它到达了它不应该到达的 stack.top(),因为堆栈是空的。我有一个 if 来检查:
if(!st.empty());
//do stuff
(我已经初始化
stack<int> st;
)。
但是虽然我可以在调试中看到堆栈是空的,但它仍然在 if! 我什至写了这段代码:
if(st.size()>0);
cout<<st.size();
它打印0!发生了什么事,我该如何解决?谢谢!
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...
}
但是在我的观点和经验中(这完全是主观的!) - 因为我自己已经陷入这个陷阱几次 - 我经历过当我在上述陈述之后有大括号时,我从来没有犯过错误再次输入分号。遵守这个约定是灵丹妙药——对我来说,其他人也可以从中受益。另外,如果那里有一个分号,只要看一眼,它就会立即引起我的注意,因为它是一种“不常见的字符模式”。
没有“在 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
}