【发布时间】:2025-12-08 23:15:01
【问题描述】:
我在 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 中没有警告。
【问题讨论】:
-
你需要从每个分支返回一个值。如果你不这样做,这是未定义的行为。
-
你得到了正确的结果只是因为你很幸运,在两个
search调用修改后的EAX之后你的函数中没有发生任何其他事情。所以他们的返回值可能仍然只是在 EAX 寄存器中。这是UB。正确指定所有返回路径。 -
请注意为什么它会在 Linux 和 Visual Studio 中得到正确答案,在“Why does a recursed return call break out of stack without an explicit return statement?”中进行了解释