递归函数中的GOTO指令

时间:2017-04-07 18:30:46

标签: c++ c

如果我在递归函数中使用goto指令(希望在自然完成之前退出函数)是否自动释放堆栈?

2 个答案:

答案 0 :(得分:1)

不,据我所知,大多数编译器都不会转到退出当前函数。

如果必须直接从深度递归throwexception(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语句不得跳转   来自具有可变修改的标识符范围之外的   键入到该标识符范围内。