在C中摆脱递归的惯用方法是什么?
发布时间:2020-12-16 09:40:35 所属栏目:百科 来源:网络整理
导读:假设我们有一个递归函数f,如果输入不正确,它可能会失败.只有在f运行时才能检测到输入中的错误. 在发生错误的情况下,C中突破f(),直接转换到原始调用函数的惯用方法是什么? setjmp / longjmp是通常的解决方案吗? 玩具示例: void g() { int arr[] = {1,2,-3,
假设我们有一个递归函数f,如果输入不正确,它可能会失败.只有在f运行时才能检测到输入中的错误.
在发生错误的情况下,C中突破f(),直接转换到原始调用函数的惯用方法是什么? setjmp / longjmp是通常的解决方案吗? 玩具示例: void g() { int arr[] = {1,2,-3,4}; int result = f(0,sizeof(arr)/sizeof(int) - 1,arr); /* if f() was successful: */ printf("%dn",); /* if error occurred in f: do something else */ } int f(int n,int i,int *arr) { if (i < 0) return n; /* if (arr[i] < 0) <-- "erroneous input" break to g() */ return f(arr[i] + n,i-1,arr); } 解决方法
选项包括:
>从f()返回状态标志,指示成功或失败.这会导致错误从错误发生的深度一次冒出一个级别,因此可能不是您想要的.请注意,如果您需要解除f()可能在每个级别声明的任何分配或释放资源,这是唯一安全的选项.>完全按照建议使用setjmp()和longjmp()来模拟抛出异常的效果并直接跳转到错误处理代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |