2016-10-02 6 views
3

これはクイックソートアルゴリズムの簡単な再帰関数です。この関数でreturn文が見つからなかったので、最後の再帰後にスタックを空にしませんか?void関数のreturn文をスタックメモリに書き込んでいませんか?

void quicksort(int arr[], int p, int r){ 
    int q = partition(arr, p, r); 
    if(p < r){ 
     quicksort(arr,p, q-1); 
     quicksort(arr,q+1, r); 
    } 
} 

この関数には返されないstatemntがありませんので、再帰関数は永久にスタックに残りますか、それとも空になりますか?

+0

再帰は 'p> = r'のときに終了します。 –

+0

閉じる '}'の直前に暗黙の 'return'文があります。一般的に、愚かなことをするツール(言語、コンパイラ)は素早く消滅する傾向があることに留意すると便利です。 –

+0

これは 'void'関数なので、戻り値は期待されません。また、通常、関数コードではなくスタックをクリーンアップする呼び出し元コードです。最後に、 'void'関数の最後には常に暗黙の' return;があります。 –

答えて

4

最終的にが終了すると、関数のスタックフレームはにクリアされます。

明示的なreturnステートメントは、これを実行するために必要ではありません。プログラムフローが閉じブレースを横切って来ると、関数はとにかく終了し、スタックフレームはクリアされます。

return(ただしC言語ではありません)なしで関数が終了できるもう1つの典型的な方法は、例外をスローすることです。再びスタックフレームがクリアされます。

+0

今後の読者が 'return'文を' exit'呼び出しと混同しないようにするために、「when * finally *」ではなく「finally * return *」というフレーズを使用します。 –

+1

@AndrewHenle面白いことに、 'return'ステートメントであいまいさを避けるために、" return "の代わりに" exit "という言葉を選びました。 :D – Jon

+0

@AndrewHenle彼は機能に言及しているので、混乱はないと思います。 – m0skit0

1

一般に、voidの文は、関数の本体の最後に到達する前に戻る場合にのみ必要です。最後の行returnステートメントは余分であり、無視することができます。スタックはreturnの有無にかかわらずクリーニングされます。

0

この関数には返されないstatemntがありませんので、再帰関数 は永遠にスタックに残りますか、それとも空になりますか?ボイド関数の場合

コードが終了したとき、それが終了します。ここで、void関数は、p> = rのときに終了する。スタックフレームは、終了時に取り外さなければならない。 コードの末尾にある最後の中括弧 '}'は暗黙のreturn文であるため、戻り値は必要ありません。

void関数の最後に明示的に 'return'を指定する必要はありません。しかし、関数/コードの終わりに達する前に特定の条件で先に終了する必要がある場合は、void関数で 'return'を使用することができます。関数がコーディングガイドライン/プラクティスとして終了した場所のあいまいさを避けたい場合は、void関数の最後に 'return'を使用することもできます。

関連する問題