我的程序崩溃了,因为它到达了它不应该到达的 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)!!!它带来了丰厚的返回! (更不用说,每次写这样一个没有括号的 block 时,都会有一只可爱的小猫死去!)ALWAYS!!
例如,这可能会耗费一天的调试时间:
差:
int i=0;
...
while(i++<1000);
doStuff(i);
好:
int i=0;
...
while(i++<1000) {
doStuff(i);
}
注意(正如@WhozCraig 再次指出的那样)这不会自动解决以分号结尾的分支和循环语句的问题,因为这是完全有效的语法: p>
if (condition);{ ...code... }
或者
if (condition);
{
...code...
}
但是以我的观点和经验(这完全是主观的!)——因为我自己也曾多次陷入这个陷阱——当我在上述陈述之后有大括号时,我经历过,我再也没有犯过输入分号的错误。遵守这个约定是一颗 Elixir - 对我来说,其他人也可以从中受益。此外,如果那里有一个分号,它会立即引起我的注意,只要看一眼,因为它是一个“不常见的字符模式”。
关于c++ - 最奇怪的 C++ 堆栈空()错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320904/