Rumah >pembangunan bahagian belakang >C++ >Mengapa Memanggil `main()` secara Rekursif dalam C Membawa kepada Gelagat Tidak Ditakrifkan?

Mengapa Memanggil `main()` secara Rekursif dalam C Membawa kepada Gelagat Tidak Ditakrifkan?

Barbara Streisand
Barbara Streisandasal
2024-12-31 01:40:13497semak imbas

Why Does Recursively Calling `main()` in C   Lead to Undefined Behavior?

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!

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