首頁 > 後端開發 > C++ > ## C 11 中的尾遞歸函數呼叫是未定義行為嗎?

## C 11 中的尾遞歸函數呼叫是未定義行為嗎?

Barbara Streisand
發布: 2024-10-25 11:17:02
原創
422 人瀏覽過

## Is Tail-Recursive Function Invocation Undefined Behavior in C  11?

尾遞歸函數呼叫在 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 標準中概述的終止條件。

具體來說,該標準指定該實作可能假設任何執行緒最終都會執行以下操作之一:

  • 終止
  • 呼叫庫I/O 函數
  • 存取或修改易失性物件
  • 執行同步或原子操作

尾遞歸函數呼叫不滿足任何這些條件,因此被視為UB。

重要的是請注意,無論這種標準解釋如何,如果過度遞歸超出了嵌套遞歸函數呼叫的實現限制,它仍然可能導致未定義的行為。 C 中一直都是這樣。

以上是## C 11 中的尾遞歸函數呼叫是未定義行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板