首頁 > 後端開發 > C++ > 你能在 C 中遞歸呼叫 main() 嗎?

你能在 C 中遞歸呼叫 main() 嗎?

Susan Sarandon
發布: 2024-11-02 20:45:02
原創
354 人瀏覽過

Can You Call main() Recursively in C  ?

在 C 語言中呼叫 main()

C 標準將 main 函數定義為每個程式的基本入口點。然而,問題出現了:「從內部呼叫 main() 是否可行?」

功能約束

根據 C 標準,不行。主函數一旦定義並執行,就標誌著程式的開始和結束。遞歸呼叫 main() 違反了這項基本原則。

實際實作

然而,在實作中,某些編譯器(如 Linux 的 g)允許在 main() 中非常規地呼叫 main()。標準並未明確支援此行為,但編譯器的實作允許此行為。

例如,考慮以下程式碼:

<code class="c++">#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int y = rand() % 10; // random number generation
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>
登入後複製

此程式碼執行隨機數生成,並且如果生成的數字不等於 7,它遞歸呼叫 main()。

組譯級分析

檢查g 產生的組譯程式碼發現main() 的呼叫就像其他函數一樣:

<code class="assembly">main:
        ...
        cmpl    , -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret</code>
登入後複製

編譯器警告

值得注意的是,雖然g編譯這樣的程式碼,它會產生一個帶有-pedantic 標誌的警告,提醒您它違反了C標準:

g.cpp:8: error: ISO C++ forbids taking address of function '::main'
登入後複製

結論

雖然在其內部呼叫main() 在某些情況下可能有效,但它並未得到C 標準的正式認可。這違反了標準行為,可能會導致不同編譯器和平台上出現未定義的結果。因此,強烈建議不要在生產程式碼中依賴這種非常規做法。

以上是你能在 C 中遞歸呼叫 main() 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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