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中文網其他相關文章!