递归函数抛出非空函数结束警告

Recursive function throwing end of non-void function warning

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

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

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

切勿忽略警告。它告诉你一些重要的事情。

在这种情况下,当您递归调用 replaceValue 时,您将丢弃该调用中的 return 值,然后在没有 return 任何东西的情况下掉落到函数底部。

您可能想改用 return replaceValue

虽然是个很老的问题我还是会回答的

这就像不为 switch 语句提供默认情况一样。当控件到达非空函数的末尾时,它没有任何内容 return,以防所有条件都失败。我相信编译器这样做是为了让您处理函数的所有极端情况和可能性。例如,如果用户输入一个您未在函数中使用的数据类型的值,则可以在不抛出异常的情况下使用默认值 returned。

如果您不想这样做,您可以随时使用 void 函数,它不会 return 任何东西。

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

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

但是如果您确定您的函数会处理所有极端情况并且控件永远不会达到默认值,那么您可以像这样在末尾添加 return x。这里的 return 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

    }