Rumah >pembangunan bahagian belakang >C++ >Bolehkah Anda Memanggil main() Secara Rekursif dalam C ?

Bolehkah Anda Memanggil main() Secara Rekursif dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-11-02 20:45:02337semak imbas

Can You Call main() Recursively in C  ?

Memanggil main() dalam Dirinya dalam C

Piawaian C menggariskan fungsi utama sebagai titik masuk asas untuk setiap program. Walau bagaimanapun, persoalan timbul: "Adakah boleh untuk memanggil main() dari dalam dirinya sendiri?"

Kekangan Fungsian

Mengikut Piawaian C, no. Fungsi utama, setelah ditakrifkan dan dilaksanakan, menandakan permulaan dan penghujung program. Memanggil main() secara rekursif melanggar prinsip asas ini.

Pelaksanaan Praktikal

Walau bagaimanapun, dalam amalan, penyusun tertentu seperti Linux's g membenarkan panggilan tidak konvensional main() dalam main(). Tingkah laku ini tidak disokong secara eksplisit oleh standard tetapi dibenarkan oleh pelaksanaan pengkompil.

Sebagai contoh, pertimbangkan kod berikut:

<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>

Kod ini melaksanakan penjanaan nombor rawak, dan jika nombor yang dijana tidak sama dengan 7, ia secara rekursif memanggil main().

Analisis Tahap Perhimpunan

Memeriksa kod pemasangan yang dijana oleh g mendedahkan bahawa main() digunakan sama seperti fungsi lain :

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

Amaran Pengkompil

Perlu diperhatikan bahawa semasa g menyusun kod tersebut, ia menghasilkan amaran dengan bendera -pedantic untuk mengingatkan anda bahawa ia melanggar Standard C:

g.cpp:8: error: ISO C++ forbids taking address of function '::main'

Kesimpulan

Walaupun memanggil main() dalam dirinya sendiri mungkin berfungsi dalam sesetengah situasi, ia tidak dibenarkan secara rasmi oleh Standard C. Ini adalah pelanggaran tingkah laku standard dan boleh membawa kepada hasil yang tidak ditentukan merentas penyusun dan platform yang berbeza. Oleh itu, amat tidak digalakkan untuk bergantung pada amalan tidak konvensional ini dalam kod pengeluaran.

Atas ialah kandungan terperinci Bolehkah Anda Memanggil main() Secara Rekursif dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn