警告“控制可能达到无效功能的结束”

时间:2013-10-23 03:33:03

标签: c++ xcode

我在Xcode中运行了一个C ++程序,遇到了警告" Control可能会到达非void函数的结束"。这是代码:

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中得到了正确答案而没有警告。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

现在你的函数允许你流出函数的末尾而没有明确的返回undefined behavior,草案标准部分6.6.3 返回语句说;

  

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

最后两个 else 没有 return 语句:

 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); 

答案 2 :(得分:0)

else if(x < head->key)
    search(head->lchild, x);
else
    search(head->rchild, x);

在这些分支中,你是:

  • 递归地呼叫search
  • 丢弃它返回的值
  • 没有归还任何东西

不从函数返回值是Undefined Behavior。您获得正确结果的事实纯粹是偶然的,不可依赖,编译器可以选择格式化硬盘或订购披萨。

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

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