这是quicksort算法的简单递归函数,我在这个函数中找不到return语句,所以在最后一次递归后它不会清空堆栈吗?
void quicksort(int arr[], int p, int r){
int q = partition(arr, p, r);
if(p < r){
quicksort(arr,p, q-1);
quicksort(arr,q+1, r);
}
}
这个函数没有返回statemnt,所以递归函数会永久保留在堆栈上还是会被清空?
答案 0 :(得分:4)
当函数最终退出时,该函数的堆栈帧被清除。
没有必要使用明确的return
语句;当程序流遇到关闭括号时,函数将无论如何都会退出,并且它的堆栈帧将被清除。
函数可以在没有return
的情况下退出的另一种典型方式(尽管不在C中)是抛出异常;再次,堆栈帧将被清除。
答案 1 :(得分:1)
通常,只有在您希望在到达函数体的末尾之前返回的情况下,return
函数中的void
语句才是必需的。最后一行return
语句是多余的,可以忽略。使用或不使用return
清除堆栈。
答案 2 :(得分:0)
此函数没有返回statemnt,因此递归函数也是如此 永远留在堆栈上还是会被清空?
在void函数的情况下,当代码结束时,它结束。这里,当p> = r时,void函数将结束。堆叠框架结束时应移除。 代码末尾的最后一个结束大括号'}'是一个隐式的返回语句,因此不需要返回。
对于void函数,最后不需要显式的'return'。但是,如果在到达函数/代码结束之前它应该在某些条件下先退出,则可以在void函数中使用'return'。如果你想避免在函数结束时作为编码指南/练习的模糊性,你也可以在void函数结束时使用'return'。