所以我遇到需要突破当前函数并回到函数开头的情况,其中一些包括错误检查(我没有学习try
,throw
,或者catch
但是最近我一直在使用递归,忽略了这样一个事实,即递归不像goto
那样起作用,只是返回到函数的开头,而是创建一个单独的自身副本因此,如果我使用递归来捕获客户端输入错误之类的东西,如果客户端产生足够的错误,则可能导致潜在的内存泄漏。
我想知道是否有一个特定的功能可以让我'重启'一个功能。
作为使用伪伪代码的示例:
int foo(){
//prompt for and receive input
if(!matchCondition)
//stop foo() and restart foo()
//does something
}
我能想到的唯一另一件事是将函数调用放在循环中,但如果函数在main()
中,那么这不是最佳的我不能完全调用{{1}在main
内的循环中,不创建至少一个副本。另一个不起作用的例子是函数需要返回没有限制的东西,因此可以自然地生成“错误代码”而不会发生错误。
main
我唯一能想到的是bool ifError=1;
while(ifError){
ifError = foo();
}
int foo(){
//prompt for and receive input
if(!matchCondition)
return 1;
//do something
return 0;
}
语句指向goto
被调用的行。如果它存在,但我知道这是我做过的最糟糕的事情。
答案 0 :(得分:5)
goto
不是“你做过的最糟糕的事情”;事实上,在某些情况下,明智的goto
比任何替代方案都更具可读性。
但是,这不是其中之一。我建议你做这样的事情:
TYPE input_thing_from_user()
{
TYPE rv;
do
rv = read_input_from_user();
while (is_invalid(rv));
return rv;
}
使用单独的循环输入每个东西;如果用户在列表末尾附近陷入困境,请不要让用户重新输入所有内容。
答案 1 :(得分:1)
你可以这样做:
int foo()
{
while (true)
{
...
if (/* this should start over */)
continue;
...
if (/* this should end */)
return /* some value */;
...
}
}