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

标签 c++ stl

我的程序崩溃了,因为它到达了它不应该到达的 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/

相关文章:

c++ - 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

c++ - 根据类内的字符串对用户定义类的 vector 进行排序

c++ - 无法分配列表迭代器 [C++]

c++ - 比较有符号和无符号字符

c++ - std::string 析构函数中的奇怪错误

c++ - 实例化一个 unordered_multiset

c++ - Vector在C++中的实现

c++ - find_if on vector<Message*> with bind2nd 和 functor

c++ - 查找大数数字总和的最快方法

c++ - 在不影响信号/槽机制的情况下处理由于方法内部的动态分配而导致的内存泄漏