我从博客中看到了一些C ++代码。我在IDE中测试了代码。即使没有递归调用中的return语句(搜索(head-> lchild,x)和搜索(head-> rchild,x)),代码中的函数也可以正常工作;任何人都可以解释原因吗?
Node* search(Node* head, int x){
if(head == NULL) return NULL;
else if(x == head->key) return head;
else if(x <= head->key) search(head->lchild, x);
else search(head->rchild, x);
}
答案 0 :(得分:2)
您的代码具有未定义的行为,因此可能发生任何事情,包括按照您的意图行事。在Clang下,你没有得到预期的结果。
我做了很少的修改,让你的代码编译并运用未定义的行为路径:
struct Node { int key; Node *lchild; Node *rchild; };
Node *search(Node *head, int x){
if(head == nullptr) return nullptr;
else if(x == head->key) return head;
else if(x <= head->key) search(head->lchild, x);
else search(head->rchild, x);
}
Node a { 0, nullptr, nullptr };
Node b { 1, &a, nullptr };
int main() { search(&b, 0); }
默认情况下,Clang会对您的代码发出警告,并导致代码在-O0
处的函数结束时崩溃:
$ clang++ -std=c++11 wszdwp.cpp
wszdwp.cpp:7:1: warning: control may reach end of non-void function [-Wreturn-type]
}
^
1 warning generated.
$ ./a.out
zsh: illegal hardware instruction (core dumped) ./a.out
对于Clang的-fsanitize=undefined
,我明白了:
$ clang++ -std=c++11 -w -fsanitize=undefined wszdwp.cpp && ./a.out
wszdwp.cpp:2:7: runtime error: execution reached the end of a value-returning function without returning a value
代码可能对你有用,因为你的编译器“帮助”在函数体的末尾放入ret
指令(没有填入返回值reigster,所以返回值很可能是从您调用的上一个函数继承而来。
答案 1 :(得分:1)
定义一个没有返回语句的非void函数有一个Undefined Bihavour,并且与没有表达式的返回语句相同。
C ++ 11在§ 6.6.3
中说:
6.6.3 The return statement
2 A return statement with neither an expression nor a braced-init-list can be
used only in functions that do not return a value, that is, a function with
the return type void, a constructor (12.1), or a destructor (12.4).
...
Flowing off the end of a function is equivalent to a return with no value;
this results in undefined behavior in a value-returning function.
您必须在编译器中打开警告:
g++ -Wall
你会得到错误:
warning: no return statement in function returning non-void [-Wreturn-type]
}
^