0

所以我有一些情况需要跳出当前函数并返回到函数的开头,其中一些包括错误检查(我还没有学过trythrow或者catch还没有),最近我一直在使用递归忽略递归不像 a 那样起作用goto并且只是返回到函数的开头而是创建自身的单独副本的事实,因此如果我使用递归来捕获诸如客户端输入错误之类的东西,如果客户端犯了足够多的错误,它可以导致潜在的内存泄漏。

我想知道是否有一个特定的功能可以让我“重新启动”一个功能。

作为使用伪伪代码的示例:

int foo(){
     //prompt for and receive input
     if(!matchCondition)
          //stop foo() and restart foo()
     //does something
}

我能想到的唯一另一件事是将函数调用放入循环中,但这不是最佳选择,例如,如果函数在main()我不能完全将调用放入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指向foo()被调用行的语句。如果它存在,但我知道这是我能做的最糟糕的事情。

4

2 回答 2

5

goto不是“你能做的最糟糕的事情”;事实上,在某些情况下,明智goto的选择比其他任何选择都更具可读性。

然而,这不是这些时代之一。我建议你这样做:

TYPE input_thing_from_user()
{
    TYPE rv;
    do
        rv = read_input_from_user();
    while (is_invalid(rv));
    return rv;
}

为每个要输入的内容使用单独的循环;如果用户在列表末尾附近搞砸了,不要让用户重新输入所有内容。

于 2013-10-02T22:30:14.337 回答
1

你可以这样做:

int foo()
{
    while (true)
    {
        ...
        if (/* this should start over */)
            continue;
        ...
        if (/* this should end */)
            return /* some value */;
        ...
    }
}
于 2013-10-02T22:32:23.207 回答