C++ 跳回C+中函数的开头+;
因此,在某些情况下,我需要中断当前函数并返回到函数的开头,其中一些包括错误检查(我还没有学习C++ 跳回C+中函数的开头+;,c++,function,methods,recursion,C++,Function,Methods,Recursion,因此,在某些情况下,我需要中断当前函数并返回到函数的开头,其中一些包括错误检查(我还没有学习try,throw,或catch)最近,我一直在使用递归,忽略了一个事实,即递归的功能不像goto那样,只是返回到函数的开头,而是创建一个单独的自身副本,因此如果我使用递归捕捉客户端输入错误之类的内容,如果客户端出现足够的错误,这可能会导致潜在的内存泄漏 我想知道是否有一个特定的函数可以让我“重新启动”一个函数 作为使用伪代码的示例: int foo(){ //prompt for and re
try
,throw
,或catch
)最近,我一直在使用递归,忽略了一个事实,即递归的功能不像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()
的那一行。如果它存在,但我知道这是我能做的最糟糕的事情。goto
不是“你能做的最糟糕的事情”;事实上,在某些情况下,明智的goto
比任何备选方案都更具可读性
然而,现在不是这样的时候。我建议你这样做:
TYPE input_thing_from_user()
{
TYPE rv;
do
rv = read_input_from_user();
while (is_invalid(rv));
return rv;
}
使用一个单独的循环为每件事输入;如果用户在列表末尾出现问题,不要让他们重新键入所有内容。goto
不是“你能做的最糟糕的事情”;事实上,在某些情况下,明智的goto
比任何备选方案都更具可读性
然而,现在不是这样的时候。我建议你这样做:
TYPE input_thing_from_user()
{
TYPE rv;
do
rv = read_input_from_user();
while (is_invalid(rv));
return rv;
}
使用一个单独的循环为每件事输入;如果用户在列表末尾出现问题,不要让他们重新键入所有内容。您可以:
int foo()
{
while (true)
{
...
if (/* this should start over */)
continue;
...
if (/* this should end */)
return /* some value */;
...
}
}
你可以做:
int foo()
{
while (true)
{
...
if (/* this should start over */)
continue;
...
if (/* this should end */)
return /* some value */;
...
}
}
如果你跳回到函数的开头,你将如何摆脱糟糕的状态?你在乞求被放入一个无止境的循环中。@Beta在函数中通常会有一个提示让客户端输入一些东西,向后跳会让他们有另一个正确输入东西的机会。对不起,我应该指定。如果您跳回到函数的开头,您将如何摆脱坏状态?你在乞求被放入一个无止境的循环中。@Beta在函数中通常会有一个提示让客户端输入一些东西,向后跳会让他们有另一个正确输入东西的机会。对不起,我应该指定的。我不太确定
类型是什么。通常,这些东西也会循环每个输入,因此,如果他们搞砸了,他们就不必全部重做,因为他们已经存储了其他数据。只是在那些他们确实搞砸的时候,他们可以重新放那东西。TYPE是一个占位符,表示您从用户那里读取的输入需要具有的任何类型。如果存在依赖于多个输入的输入有效性检查,则在该组输入周围放置另一个循环。啊,好的,我明白了。所以基本上只是在循环时嵌套。是的!任何时候你可能需要回去重做一些东西,首先考虑循环。(有时循环不是答案,但很可能是答案。)此外,如果您发现自己嵌套的循环超过两个深度,那么可能是时候考虑将函数拆分为更小的部分了。为了获得额外的学分(如果您已经学习过模板),TYPE可以是模板类型,read_inpu_from_user,如果它将rv作为一个pass-by-ref或指针,则可能是每个类型的重载函数。我不太确定类型是什么。通常,这些东西也会循环每个输入,因此,如果他们搞砸了,他们就不必全部重做,因为他们已经存储了其他数据。只是在那些他们确实搞砸的时候,他们可以重新放那东西。TYPE是一个占位符,表示您从用户那里读取的输入需要具有的任何类型。如果存在依赖于多个输入的输入有效性检查,则在该组输入周围放置另一个循环。啊,好的,我明白了。所以基本上只是在循环时嵌套。是的!任何时候你可能需要回去重做一些东西,首先考虑循环。(有时循环不是答案,但很可能是答案。)此外,如果您发现自己嵌套的循环超过两个深度,那么可能是时候考虑将函数拆分为更小的部分了。为了获得额外的学分(如果您已经学习过模板),TYPE可以是模板类型,read_inpu_from_user,如果它将rv作为传递引用或指针,则可能是每种类型的重载函数