0

そのため、現在の関数から抜け出して関数の先頭に戻る必要がある状況があります。これらのいくつかにはエラーチェックが含まれており ( trythrow、またはcatchまだ学習していません)、最近では再帰を使用しています。再帰は a のようには機能せずgoto、単に関数の先頭に戻るだけでなく、それ自体の別のコピーを作成するという事実を無視します。したがって、再帰を使用してクライアントの入力エラーなどをキャッチすると、クライアントが十分なエラーを発生させると、潜在的なメモリリークにつながります。

関数を「再起動」できる特定の関数があるかどうか疑問に思っていました。

疑似疑似コードを使用した例として:

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

私が考えることができる他の唯一のことは、関数呼び出しをループに入れるmain()ことです. それが機能しない別の例は、関数が制限のないものを返す必要がある場合で、エラーが発生することなく「エラー コード」が自然に生成される場合です。mainmain

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方法がどの選択肢よりも読みやすい状況があります。

ただし、これはこれらの時間の 1 つではありません。次のようなことをお勧めします。

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 に答える