無制限再帰は不定の動作ですか?
C 11 では、次のように副作用のない無限ループは未定義の動作 (UB) とみなされます。次のコード:
<code class="cpp">int main() { while (true) {} }</code>
この動作は C 標準によって規定されており、実装ではいずれかのスレッドが最終的に終了する、I/O 操作を実行する、揮発性オブジェクトにアクセス/変更する、または実行することを想定できると規定されています。
次のコードに示すように、この定義は無制限の再帰にも適用されるのでしょうか。
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
C 標準によれば、両方の動作はプログラムは、どちらも非 UB の標準定義で指定されているアクションを実行しないため、未定義です。
ただし、C 標準が無制限の再帰 UB を考慮していなかったとしても、依然として可能性があることに注意することが重要です。再帰がネストされた再帰関数呼び出しの数に関する実装の制限を超える場合、未定義の動作が発生します。これは常に当てはまり、C 標準でのループのステータスが UB であるかどうかに関係なく、引き続き当てはまります。
以上が## C 11 の無制限再帰は未定義の動作に該当しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。