即使不执行返回,非void函数也能正常工作

Ted*_*ddy 2 c++ function binary-search-tree

我是一名计算机科学专业的大学生.昨天,我有一个关于使用C++的二进制搜索树的课程.我们由该班的实验室助理教授.

他们将树中的节点定义为这样的结构:

struct Data{
    char name[15];
    int age;
    Data *left,*right;
};
Run Code Online (Sandbox Code Playgroud)

他们给了我们一个在BST内搜索的代码,如下所示:

// temp is current node, name is the value of the node to be searched for.
Data* search(Data *temp,char name[]) {
    if(strcmp(temp->name,name)>0)
        search(temp->left,name);
    else if(strcmp(temp->name,name)<0)
        search(temp->right,name);
    else
        return temp;
}
Run Code Online (Sandbox Code Playgroud)

我注意到代码是错误的.如果函数进入第一个或第二个if块,它将不执行任何return语句.

但是当实验室助理运行代码时,它运行得很好.

我想也许这种行为是特定于编译器的.但是当我在gcc上尝试该代码时,该函数也可以正常工作.(我们大学使用microsoft visual c ++编译器)

任何人都可以解释发生了什么?为什么这段代码有效?

PS:忽略其他错误,例如当节点为空时,找不到值等.

Luc*_*ore 8

这只是未定义的行为.

似乎工作,因为有一个寄存器保存返回值.在递归树的最深路径中,temp移动到该寄存器中,之后永远不会清除或更改,因此寄存器将包含正确的节点,直到第一次调用返回.

当第一个调用返回时,调用上下文检查该寄存器的返回值,这恰好是正确的.但你不应该依赖于此.假设它始终有效并不安全.