gpt4 book ai didi

c - C中的递归函数返回值而不返回

转载 作者:行者123 更新时间:2023-12-05 01:50:28 33 4
gpt4 key购买 nike

所以我正在用 C 编写一些二叉搜索树函数(这里是完美运行的节点结构和插入函数):

typedef struct searchTreeNode {
int data;
struct searchTreeNode *left;
struct searchTreeNode *right;
} STNode;


void insert(STNode **proot, int data) {

STNode *node = *proot;
if (!node) {
*proot = newNode(data);
return ;
}
if (data <= node -> data) insert(&(node -> left), data);
else insert(&(node -> right), data);
}

而且我发现以下用于查找树的最大值的递归函数工作得很好,即使最后一个递归调用实际上返回了一个整数:

int max(STNode *node) {

if (!node) return 0;
if (!(node -> right)) return node -> data;
max(node -> right);
}

这意味着,如果我没记错的话,它的作用与此完全相同:

int max(STNode *node) {

if (!node) return 0;
if (!(node -> right)) return node -> data;
return max(node -> right);
}

函数现在返回它从下一个递归调用中获得的值。

这是函数返回最后返回值的已知行为还是我遗漏了什么?

这是我的主要函数,带有一些随机数:

int main() {

STNode *root = NULL;
insert(&root, 10);
insert(&root, 13);
insert(&root, 14);
insert(&root, 124);
insert(&root, 1);
insert(&root, 8);
insert(&root, 3);

printf("Max value: %d\n", max(root));

return 0;
}

最佳答案

由于 max 的第一个版本不会在所有路径上返回 值,因此当调用者尝试读取该值时会导致未定义的行为。由编译器决定如何处理。不能保证编译器会在某处插入 return。在那种情况下你不能依赖任何东西。

在您的特定平台上实际上可能发生的是路径

if (!node) return 0;
if (!(node -> right)) return node -> data;

写入返回值的寄存器。递归调用 max(node -> right); 意味着在最后两个 return 之一将发生并且返回值将在正确的寄存器中。因此,当 max 在没有显式 return ...; 的情况下静默返回时,编译器可能只会发出返回机器码并保持返回寄存器不变。这当然只会发生,因为对 max 的递归调用是函数中的最后一条语句(修改返回寄存器)。

但是如前所述,请不要那样做,这是未定义的行为,将来很可能会给您带来麻烦。

关于c - C中的递归函数返回值而不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73066377/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com