递归函数抛出非void函数警告的结束

时间:2015-10-04 04:25:11

标签: c++ recursion warnings

    Node * replaceValue(Node * x) const
    { 
        if (x == nullptr)
            return nullptr;
        if (x->left != nullptr)
            replaceValue(x->left);
        else
            return x;
    }

警告:控制到达非空函数的结尾

我应该忽略这个吗?我确保这个函数总是返回一些东西(所有指针都用nullptr初始化),但我不希望这个警告继续弹出。如果我在函数末尾添加一个返回nullptr,那么它就会崩溃。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:4)

永远不要忽略警告。它告诉你一些重要的事情。

在这种情况下,当您以递归方式调用replaceValue时,您将丢弃该调用的返回值,然后从该函数的底部掉出而不返回任何内容。

您可能希望改为使用return replaceValue

答案 1 :(得分:0)

尽管这是一个非常老的问题,我还是会回答

这就像不为switch语句提供默认大小写一样。当控件到达非void函数的末尾时,如果所有条件都失败,则没有任何返回值。我相信编译器会这样做,以便您处理所有极端情况和该功能的可能性。例如,如果用户输入的函数中未使用的数据类型的值,则在不引发异常的情况下,可以返回默认值。

如果您不想执行此操作,则可以始终使用不返回任何内容的void函数。

您应该考虑添加这样的return语句,以便在递归调用之后返回一个值。

if (x->left != nullptr)
     return replaceValue(x->left);

但是,如果您确定函数可以处理所有极端情况,并且控件永远不会达到默认值,则可以像这样在末尾添加return xreturn x只是为了消除错误消息,而对于您的情况,则仅此而已。

    Node * replaceValue(Node * x) const
    { 
        if (x == nullptr)
            return nullptr;
        if (x->left != nullptr)
            replaceValue(x->left);
        else
            return x;          

        return x;               // Default value

    }