【问题标题】:Does it make a difference where I put this if statement?我把这个 if 语句放在哪里有影响吗?
【发布时间】:2018-02-25 04:51:38
【问题描述】:

所以我在一个带有链接列表的实验室中工作,如果在遍历列表后找不到元素,我必须输出错误消息。我的问题是,如果我把这个 if 语句放在 while 循环之后还是 else 语句之后,难道不应该有所不同吗?如果我把它放在第二个 else 之后,函数不应该在 else 完成执行后立即结束吗? 我尝试运行它,但仍然得到相同的预期输出,但我试图找出将它放在哪里最有意义,因为实验室是根据效率和风格进行分级的。

void AnyList::deleteNode(int deleteData)
{
    if (count == 0)
    {
        cerr << "Cannot delete from an empty list.\n";
    }
    else
    {
        Node *current = ptrToFirst; 
        bool found = false; 

        if (current->getData() == deleteData)
        {
            ptrToFirst = current->getPtrToNext();
            delete current;
            current = NULL;
            count--; 
            found = true; 
        }
        else
        {

            Node *trailCurrent = current;
            current = current->getPtrToNext(); 

            while (current != NULL && !found)
            {
                if (current->getData() == deleteData)
                {
                    trailCurrent->setPtrToNext(current->getPtrToNext());
                    delete current;
                    current = NULL;
                    trailCurrent = NULL;
                    count--;
                    found = true;
                }
                else
                {
                    trailCurrent = current; 
                    current = current->getPtrToNext();
                }
            }
            //if (!found)             <-- Does it make more sense to put it here?
            //{
            //  cerr << "Item to be deleted is not in the list.\n";
            //}

        }
        //if (!found)                 <-- Or here?
        //{
        //  cerr << "Item to be deleted is not in the list.\n";
        //}
    }

}

【问题讨论】:

  • 如果bool found = false; 被声明在else { 的范围内(连同Node *trailCurrent = current;),那会有所不同。在这种情况下,第一个 if 是唯一一个 found 仍在范围内的。

标签: c++ pointers if-statement linked-list


【解决方案1】:

if (!found) 块放到它可能实际运行的更有限的范围内有助于读者理解和维护代码。

功能没有区别(即程序做同样的事情)。

不应该有性能差异(使用优化的构建)。当current-&gt;getData() == deleteDatatrue 时,它将设置found true,因此检查if (!found) 将毫无意义。您的编译器应该足够聪明,可以从 if (current-&gt;getData() == deleteData) 控制的语句块的末尾跳过 if (!found) { ... } 块,在这种情况下,性能将与使用 `if (! found) 是更本地化的范围。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2017-05-25
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多