Node * replaceValue(Node * x) const
{
if (x == nullptr)
return nullptr;
if (x->left != nullptr)
replaceValue(x->left);
else
return x;
}
警告:控制到达非空函数的结尾
我应该忽略这个吗?我确保这个函数总是返回一些东西(所有指针都用nullptr初始化),但我不希望这个警告继续弹出。如果我在函数末尾添加一个返回nullptr,那么它就会崩溃。有没有办法解决这个问题?
答案 0 :(得分:4)
永远不要忽略警告。它告诉你一些重要的事情。
在这种情况下,当您以递归方式调用replaceValue时,您将丢弃该调用的返回值,然后从该函数的底部掉出而不返回任何内容。
您可能希望改为使用return replaceValue
。
答案 1 :(得分:0)
尽管这是一个非常老的问题,我还是会回答。
这就像不为switch
语句提供默认大小写一样。当控件到达非void函数的末尾时,如果所有条件都失败,则没有任何返回值。我相信编译器会这样做,以便您处理所有极端情况和该功能的可能性。例如,如果用户输入的函数中未使用的数据类型的值,则在不引发异常的情况下,可以返回默认值。
如果您不想执行此操作,则可以始终使用不返回任何内容的void
函数。
您应该考虑添加这样的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
}