Rumah >pembangunan bahagian belakang >C++ >Mengapa Memanggil `main()` secara Rekursif dalam C Membawa kepada Gelagat Tidak Ditakrifkan?
Panggilan Rekursif Utama dalam C : A Journey into Undefined Territory
Coretan kod membingungkan yang dibentangkan di bawah telah mencetuskan rasa ingin tahu dalam komuniti pengaturcaraan:
int main () { return main(); }
Mengejutkan ramai, kod ini menyusun dengan jayanya. Walau bagaimanapun, pelaksanaannya mendedahkan tingkah laku yang menarik: ia berjalan selama-lamanya. Pemerhatian pelik ini telah menimbulkan persoalan tentang mekanik asas.
Dilema Memanggil Utama
Piawaian C secara eksplisit mengisytiharkan dalam [basic.start.main] p3 bahawa " Fungsi utama tidak boleh dinamakan dengan ungkapan." Larangan ini berpunca daripada sifat utama sebagai titik masuk program, yang digunakan oleh perpustakaan masa jalan sekali. Sebarang panggilan berikutnya ke utama tidak dibenarkan, oleh itu kekurangan ungkapan bernama.
Gelagat Pengkompil dan Gelagat Tidak Ditakrifkan
Menurut [intro.compliance.general], a kewajipan pengkompil adalah untuk menjana kod boleh laku daripada program yang dibentuk dengan baik. Walaupun ia mungkin memberikan amaran atau ralat, ia tidak diperlukan untuk menguatkuasakan semua peraturan. Dalam kes khusus ini, penyusun mempunyai budi bicara untuk bertindak balas secara berbeza terhadap pelanggaran panggilan utama.
Embrace the Unknown
Akhirnya, keputusan yang menentukan ke atas tingkah laku ini coretan kod terletak dalam lingkungan tingkah laku yang tidak ditentukan. Mengikut definisi standard, apa-apa boleh berlaku apabila tingkah laku yang tidak ditentukan berlaku. Percubaan untuk merasionalkan hasil sedemikian adalah sia-sia, kerana akibatnya tidak dapat diramalkan sepenuhnya.
Kesimpulannya, walaupun sintaks kod yang dibentangkan adalah sah, pelaksanaannya menghasilkan tingkah laku yang tidak ditentukan. Adalah lebih baik untuk mematuhi larangan piawaian terhadap ungkapan bernama yang memanggil utama, supaya program anda memulakan perjalanan yang tidak dapat diramalkan ke tempat yang tidak diketahui.
Atas ialah kandungan terperinci Mengapa Memanggil `main()` secara Rekursif dalam C Membawa kepada Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!