首頁  >  文章  >  後端開發  >  C 語言中 main() 函數可以呼叫自身嗎?

C 語言中 main() 函數可以呼叫自身嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-03 00:09:02902瀏覽

Can the main() function call itself in C  ?

main() 函數中的遞歸:意外的編譯器行為

C 中通常不允許呼叫 main() 函數。然而,實際上,在某些平台上是可能的,特別是在具有 g 編譯器的 Linux 系統上。讓我們深入研究一下這種行為是如何實現的。

在提供的程式碼範例中:

<code class="cpp">#include <iostream>
#include <cstdlib>

int main() {
    cout << "!!!Hello World!!!" << endl;
    system("pause");
    return main();
}</code>

main() 函數中對 main() 的呼叫允許無限迴圈。然而,這不是標準的 C 行為。

編譯器魔術或未定義行為?

是否可以使用魔術變數或巨集來取得目前正在運行的函數?不,C 標準中沒有這樣的規定。

Linux 編譯器異常

儘管標準禁止,Linux g 編譯器仍使用 main() 呼叫來編譯程式碼main() 不會引發錯誤。這是由於編譯器對 C 標準的寬鬆解釋。

實際示範

考慮以下程式碼:

<code class="cpp">#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
    int y = rand() % 10; // returns 3, then 6, then 7
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>

當使用g ,此程式碼產生如下所示的彙編程式碼:

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

在此彙編程式碼中, main 的呼叫就像其他函數一樣。 main() 函數中對 main() 的呼叫被翻譯為常規函數呼叫。

結論

從main() 內部調用main() 是儘管C 標準不允許,但在具有容忍此類行為的特定編譯器的某些平台上可能會這樣做。但需要強調的是,這不是標準 C,在不同環境或編譯器版本中可能會導致意外結果。

以上是C 語言中 main() 函數可以呼叫自身嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn