在C ++中缺少return语句仍然可以工作

时间:2014-01-07 03:23:23

标签: c++ recursion return-value

我从博客中看到了一些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);
}

2 个答案:

答案 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]
 }
 ^