首頁  >  文章  >  後端開發  >  C 中允許遞歸呼叫“main()”嗎?

C 中允許遞歸呼叫“main()”嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-01 07:03:01583瀏覽

Is Recursively Calling `main()` in C   Allowed?

main() 可以在 C 遞歸呼叫嗎?

下面的程式碼片段示範了在C 中遞歸呼叫main() 的奇怪行為.

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

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

程式碼編譯成功,執行時顯示“Hello World!!!”無限期地。然而,值得注意的是,這種行為在 C 中不符合標準。 C 標準明確禁止遞歸呼叫 main() 或取得其位址。

但實際上,某些編譯器(例如 Linux g 編譯器)允許在 main() 中呼叫 main()。這種寬容性在以下程式碼中很明顯:

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

執行時,此程式碼會產生一系列「y」值(例如3、6、7),每個值都來自對main( ) 的後續調用.

分析編譯後的程序集發現main() 的調用方式與任何其他函數一樣:

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

儘管標準禁止,但g 似乎容忍此類調用。然而,這種行為並沒有得到保證,程式設計師應該避免依賴它來確保可移植性和符合 C 標準。

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

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