尾遞歸函數呼叫在 C 11 中是未定義行為嗎?
在C 11 中,無限循環沒有副作用,例如以下,根據標準被視為未定義行為(UB):
<code class="cpp">int main() { while (true) {} }</code>
相同的邏輯是否適用於沒有副作用的無限遞歸,例如下面的程式碼?
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
答案:
是的,這個遞歸也是 UB,因為它不符合 C 11 標準中概述的終止條件。
具體來說,該標準指定該實作可能假設任何執行緒最終都會執行以下操作之一:
尾遞歸函數呼叫不滿足任何這些條件,因此被視為UB。
重要的是請注意,無論這種標準解釋如何,如果過度遞歸超出了嵌套遞歸函數呼叫的實現限制,它仍然可能導致未定義的行為。 C 中一直都是這樣。
以上是## C 11 中的尾遞歸函數呼叫是未定義行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!