副作用のない再帰は未定義の動作ですか?
C 11 では、次のような副作用のない無限ループは未定義とみなされます。動作 (UB):
<code class="cpp">int main() { while (true) {} }</code>
ISO C 11 標準 (1.10p24) の次の規定により、動作は UB になります。
The implementation may assume that any thread will eventually do one of the following: - terminate, - make a call to a library I/O function, - access or modify a volatile object, or - perform a synchronization operation or an atomic operation.
この規定は、ループの例と次の再帰的プログラム:
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
この再帰的プログラムには副作用はありませんが、いずれかのスレッドが最終的にリストされたアクションのいずれかを実行するという仮定に違反するため、UB とみなされます。 1.10p24.
この規定が存在しなかったとしても、入れ子になった再帰関数呼び出しの実装定義の制限を超える場合、再帰は依然として未定義の動作を示す可能性があることに注意してください。これは、バージョンに関係なく、 C では常に当てはまります。
以上が## 副作用のない再帰は C では未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。