我把这个if语句放在哪里有所不同?

时间:2018-02-25 04:51:38

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

所以我在一个带链接列表的实验室工作,如果在遍历列表后找不到元素,我必须输出一个错误消息。我的问题是,我是否应该在while循环之后或者在else语句之后放置这个if语句?如果我把它放在其他第二个之后,那么当其他人完成执行时,该功能是否应该结束? 我尝试运行它并且我仍然得到了相同的预期输出,但是我试图找出它最有意义的地方,因为实验室的效率和风格得分。

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";
        //}
    }

}

2 个答案:

答案 0 :(得分:2)

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

没有功能的区别(即程序在任何一种方式都做同样的事情)。

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

答案 1 :(得分:2)

它不应该有所作为。

请注意,函数的整个后半部分都在else语句中,如果第一个条件current->getData() == deleteData未评估为true(如预期的那样),则该语句将运行。您也是通过第一行的count == 0检查完成的。这很好,但是如果您有多个级别if / else语句,则可能会很难阅读。

而不是将所有内容都放入else语句中,如下所示:

if (condition) {
    // do something
} else
    // otherwise, do everything else
}

我建议使用这种风格:

if (condition) {
    // do something
    return someValue;
}

// otherwise, do everything else

如果第一个if语句的条件为真,则“否则......”代码将不会运行,因为该函数将立即返回。

这将使您更容易理解程序的范围,哪些括号属于什么,并使您更容易回答问题,例如您提出的问题。