0

我在 Xcode 中运行了一个 C++ 程序,并遇到了“控制可能到达非无效函数结尾”的警告。这是代码:

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        search(head->lchild, x);
    else
        search(head->rchild, x);
}

在 Linux 中编译时我得到了同样的警告,但得到了正确的结果。但是在 Xcode 中,结果是错误的。顺便说一句,我得到了正确的答案,并且在 Visual Studio 中没有警告。

4

3 回答 3

2

我认为您的意思是返回递归调用的结果:

Node* search(Node* head, int x)
{
    if(!head)
        return NULL;
    else if(x == head->key)
        return head;
    else if(x < head->key)
        return search(head->lchild, x);
    else
        return search(head->rchild, x);
}
于 2013-10-23T03:36:33.077 回答
1

您的函数现在允许您在没有明确返回的情况下从函数的末尾流出,这是未定义的行为,标准草案部分6.6.3 返回声明说;

[...]从函数末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。[...]

最后两个else没有返回语句:

 else if(x < head->key)
    search(head->lchild, x);  // No return
 else
    search(head->rchild, x);  // No return
 // no return
}  

所以在这些情况下,你会在没有返回值的情况下结束,从而调用未定义的行为,看起来你可能打算有一个返回但只是把它们排除在外,真正的意思是:

else if(x < head->key)
    return search(head->lchild, x); 
else
    return search(head->rchild, x); 
于 2013-10-23T03:37:00.410 回答
0
else if(x < head->key)
    search(head->lchild, x);
else
    search(head->rchild, x);

在这些分支中,您是:

  • search递归调用
  • 丢弃它返回的值
  • 不返回任何东西

不从函数返回值是未定义的行为。您得到正确结果的事实纯属偶然,不可依赖,编译器可以选择格式化您的硬盘驱动器或订购比萨饼。

通过添加return语句来解决这个问题:

else if(x < head->key)
    return search(head->lchild, x);
else
    return search(head->rchild, x);
于 2013-10-23T03:37:46.857 回答