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