如果我在递归函数中使用goto指令(希望在自然完成之前退出函数)是否自动释放堆栈?
答案 0 :(得分:1)
不,据我所知,大多数编译器都不会转到退出当前函数。
如果必须直接从深度递归throw
和exception
(c ++)或使用longjmp
(c)转义,这些操作将恢复堆栈。
答案 1 :(得分:0)
考虑下面的程序,其中有一个goto语句用于最终返回。是否会通过看到goto来释放堆栈。所以即使你在函数堆栈中使用goto也会这样保持。
#include <stdio.h>
int fact(int a)
{
if(a==1)
goto A;
return a*fact(a-1);
A: return a;
}
int main()
{
printf("%d",fact(10));
}
您无法使用标准C ++中的goto从一个函数跳转到另一个函数。从$ 6.6.4 / 1的C ++语言标准
goto语句无条件地将控制转移到语句 由标识符标记。标识符应为标签(6.1) 位于当前的功能中。
...或标准C.来自C语言标准的$ 6.8.6.1 / 1
goto语句中的标识符应指定位于的标签 在封闭功能的某个地方。 goto语句不得跳转 来自具有可变修改的标识符范围之外的 键入到该标识符范围内。