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