無限再帰は未定義動作 (UB) ですか?
C プログラミングの領域では、無限再帰が未定義動作 ( UB)は議論のテーマとなっています。ループを含む特定のシナリオは UB として識別されていますが、無限再帰自体がこの分類に該当するかどうかは不明のままです。
C 11 では、以下に示すような副作用のない無限ループを含むプログラムが考慮されます。 UB:
<code class="cpp">int main() { while (true) {} }</code>
これは C 標準で 1.10p24 として文書化されています: 「実装では、スレッドが最終的に次のいずれかを実行すると想定できます: 終了、ライブラリ I/O 関数の呼び出し、揮発性オブジェクトにアクセスまたは変更するか、同期操作またはアトミック操作を実行します。」副作用のない無限ループはこれらのアクションを決して実行しないため、UB とみなされます。
次に、無限再帰を伴う次のプログラムも UB を構成するかどうかという疑問が生じます。
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
上記のプログラムは直観的に UB であると想定できますが、標準ではこの特定のシナリオに明示的に対処していません。 1.10p24 の関連する箇所では、再帰ではなくループについて言及しています。
ただし、過剰な再帰は、ネストされた再帰関数呼び出しの実装制限を超える可能性があることに注意してください。これは常に当てはまり、再帰自体の UB 分類に関係なく、未定義の動作が発生する可能性があります。
以上が## C の無限再帰は未定義の動作とみなされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。