沒有副作用的遞歸是未定義行為嗎?
在C 11 中,沒有副作用的無限循環(如下所示)被視為未定義行為(UB):
<code class="cpp">int main() { while (true) {} }</code>
由於ISO C 11 標準(1.10 p24) 中的一項規定,該行為是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中文網其他相關文章!