Sebenarnya, ada adalah perbedaan, tapi itu halus. Ini memiliki lebih banyak implikasi untuk C ++, tetapi perbedaannya penting.
Ketika saya sebut return
di main()
, destructors akan dipanggil untuk objek saya scoped lokal. Jika saya panggil exit()
, tidak ada destruktor yang akan dipanggil untuk objek yang dicakup secara lokal! Baca kembali itu. exit()
tidak kembali . Itu berarti bahwa begitu saya menyebutnya, tidak ada "backsies." Objek apa pun yang Anda buat dalam fungsi itu tidak akan dihancurkan. Seringkali ini tidak memiliki implikasi, tetapi kadang-kadang tidak, seperti menutup file (pasti Anda ingin semua data Anda di-flush ke disk?).
Perhatikan bahwa static
objek akan dibersihkan bahkan jika Anda menelepon exit()
. Akhirnya perhatikan, bahwa jika Anda menggunakan abort()
, tidak ada objek yang akan dihancurkan. Artinya, tidak ada objek global, tidak ada objek statis dan tidak ada objek lokal yang akan memanggil destruktornya.
Lanjutkan dengan hati-hati saat memilih jalan keluar daripada pulang.
http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a
thread_local
penghancur benda akan dipanggil. Destructors untuk objek lokal lainnya masih belum dipanggil. ideone.com/Y6Dh3fexit()
menutup file dengan bersih sebenarnya salah. Satu-satunya waktu data mungkin tidak memerah adalah dalam kasus sebaliknya: yaitu jika seseorang menggunakanreturn
darimain()
dan seseorang telah memanggilsetbuf()
atausetvbuf()
dengan buffer dinyatakan sebagai penyimpanan otomatis dalammain()
(seperti dibahas dalam jawaban R. di bawah). Sayang sekali pertanyaan ini ditandai dengan C dan C ++ (dan gaya pengkodean - ini bukan masalah gaya!).Perbedaan lainnya:
exit
adalah fungsi Perpustakaan Standar sehingga Anda harus menyertakan header dan tautan dengan perpustakaan standar. Untuk menggambarkan (dalam C ++), ini adalah program yang valid:tetapi untuk menggunakan
exit
Anda harus menyertakan:Plus ini menambahkan asumsi tambahan: bahwa panggilan
exit
darimain
memiliki efek samping yang sama dengan mengembalikan nol. Seperti yang telah ditunjukkan orang lain, ini tergantung pada jenis executable yang Anda bangun (yaitu, siapa yang meneleponmain
). Apakah Anda mengkode aplikasi yang menggunakan runtime C? Plugin Maya? Layanan Windows? Supir? Setiap kasus akan membutuhkan penelitian untuk melihat apakahexit
setara denganreturn
. Menggunakan IMHOexit
ketika Anda benar-benar berartireturn
hanya membuat kode lebih membingungkan. OTOH, jika Anda benar-benar jahatexit
, maka gunakanlah itu.sumber
Setidaknya ada satu alasan untuk memilih
exit
: Jika salah satuatexit
penangan Anda merujuk ke data durasi penyimpanan otomatismain
, atau jika Anda menggunakansetvbuf
atausetbuf
untuk menetapkan salah satu aliran standar, buffer durasi penyimpanan otomatis masukmain
, lalu kembali darimain
menghasilkan perilaku tidak terdefinisi, tetapi panggilanexit
valid.Namun potensi penggunaan lain (biasanya dicadangkan untuk program mainan) adalah untuk keluar dari program dengan doa rekursif
main
.sumber
main()
- itu hanya fungsi seperti yang lain. Di sisi lain karena standar tersebut telah disebutkan secara khusus dalam standar, standar tersebut harus cukup hati-hati tentang bagaimana mendefinisikanmain()
dan hal-hal yang dekat dan disukai. Namun pada akhirnya meskipun standar tidak (dan tidak boleh ) memerlukan kompiler untuk melakukan sesuatu yang khusus tentang penyimpanan otomatis dimain()
. Harap berhati-hati untuk membaca Catatan Kaki # 11 di bawah paragraf yang Anda rujuk dalam komentar Anda.Saya selalu menggunakan
return
karena prototipe standar untukmain()
mengatakan bahwa ia mengembalikan sebuahint
.Yang mengatakan, beberapa versi standar memberikan
main
perlakuan khusus dan menganggap bahwa itu mengembalikan 0 jika tidak adareturn
pernyataan eksplisit . Diberikan kode berikut:G ++ hanya menghasilkan peringatan untuk
foo()
dan mengabaikan pengembalian yang hilang darimain
:sumber
return
untuk mengakhiri eksekusi. Memanggilexit()
juga merupakan cara yang valid, dan terkadang diperlukan, untuk mengakhiri eksekusi fungsi apa pun. Memang seperti yang saya dan orang lain telah jelaskan di tempat lain, meneleponexit()
bahkan darimain()
menyampaikan niat yang jauh lebih jelas untuk keluar dari seluruh proses, menjaga penyimpanan otomatis hingga proses keluar, dan membuat pemeliharaan lebih mudah selama refactoring kode di masa depan. Untuk C menggunakanreturn
dimain()
saat tujuannya adalah untuk mengakhiri proses ini sehingga bisa dibilang praktek yang buruk.SAYA SANGAT memberikan komentar kedua oleh R. tentang penggunaan exit () untuk menghindari penyimpanan otomatis di
main()
reklamasi sebelum program benar-benar berakhir. Sebuahreturn X;
pernyataan dimain()
tidak tepat setara dengan panggilan untukexit(X);
, karena penyimpanan dinamismain()
hilang ketikamain()
kembali, tapi itu tidak lenyap jika panggilan untukexit()
dibuat sebagai gantinya.Selain itu, dalam bahasa C atau bahasa C-seperti
return
pernyataan sangat mengisyaratkan kepada pembaca bahwa eksekusi akan melanjutkan dalam fungsi panggilan, dan sementara kelanjutan eksekusi ini biasanya benar secara teknis jika Anda menghitung rutin startup C yang disebutmain()
fungsi Anda , itu tidak persis apa yang Anda maksud ketika Anda bermaksud mengakhiri proses.Lagi pula, jika Anda ingin mengakhiri program Anda dari dalam fungsi lain kecuali
main()
Anda harus memanggilexit()
. Melakukannya secara konsistenmain()
juga membuat kode Anda jauh lebih mudah dibaca, dan juga membuatnya lebih mudah bagi siapa pun untuk memasukkan faktor ulang kode Anda; kode yaitu disalin darimain()
ke beberapa fungsi lain tidak akan berperilaku tidak benar karenareturn
pernyataan tidak disengaja yang seharusnya menjadiexit()
panggilan.Jadi, menggabungkan semua poin ini bersama kesimpulannya adalah bahwa itu kebiasaan buruk , setidaknya bagi C, untuk menggunakan
return
pernyataan untuk mengakhiri programmain()
.sumber
exit()
secara umum, tetapi gunakan jika athrow
atauabort()
alternatif tidak bekerja dalam konteks tertentu. Tetapi terutama hindariexit()
di main, dan gunakan return in main sebagai praktik biasa.Dengan beberapa kompiler untuk platform yang tidak umum,
exit()
mungkin menerjemahkan argumennya ke nilai keluar program Anda sementara pengembalian darimain()
mungkin hanya meneruskan nilai langsung ke lingkungan host tanpa terjemahan apa pun.Standar ini memerlukan perilaku yang identik dalam kasus ini (khususnya, ia mengatakan mengembalikan sesuatu yang
int
-compatible darimain()
harus setara dengan memanggilexit()
dengan nilai itu). Masalahnya adalah bahwa OS yang berbeda memiliki konvensi yang berbeda untuk menafsirkan nilai keluar. Pada banyak sistem (BANYAK!), 0 berarti sukses dan yang lainnya gagal. Tetapi pada, katakanlah, VMS, nilai ganjil berarti kesuksesan dan bahkan yang berarti kegagalan. Jika Anda kembali 0 darimain()
, pengguna VMS akan melihat pesan buruk tentang pelanggaran akses. Sebenarnya tidak ada pelanggaran akses - itu hanya pesan standar yang terkait dengan kode kegagalan 0.Kemudian ANSI datang dan memberkati
EXIT_SUCCESS
danEXIT_FAILURE
sebagai argumen Anda bisa lolosexit()
. Standar ini juga mengatakan bahwaexit(0)
harus bersikap identik denganexit(EXIT_SUCCESS)
, sehingga sebagian besar implementasi mendefinisikanEXIT_SUCCESS
untuk0
.Standar, oleh karena itu, membuat Anda terikat pada VMS, karena tidak meninggalkan cara standar untuk mengembalikan kode kegagalan yang kebetulan memiliki nilai 0.
Oleh karena itu, kompiler VAX / VMS C awal 1990-an tidak menafsirkan nilai balik dari
main()
, ia hanya mengembalikan nilai apa pun ke lingkungan host. Tetapi jika Anda menggunakannyaexit()
akan melakukan apa yang diperlukan standar: menerjemahkanEXIT_SUCCESS
(atau0
) menjadi kode sukses danEXIT_FAILURE
menjadi kode kegagalan umum. Untuk menggunakannyaEXIT_SUCCESS
, Anda harus meneruskannyaexit()
, Anda tidak dapat mengembalikannyamain()
. Saya tidak tahu apakah versi yang lebih modern dari kompiler itu mempertahankan perilaku itu.Program C portabel digunakan untuk terlihat seperti ini:
Selain itu: Jika saya mengingat dengan benar, konvensi VMS untuk nilai keluar lebih bernuansa daripada ganjil / genap. Ini sebenarnya menggunakan sesuatu seperti tiga bit rendah untuk mengkodekan tingkat keparahan. Secara umum, tingkat keparahan ganjil mengindikasikan keberhasilan atau informasi lain-lain dan bahkan genap mengindikasikan kesalahan.
sumber
returned
denganmain
berbeda dari nilai yang diteruskan keexit
- tetapi standar secara khusus mengatakan, "Jika tipe pengembalianmain
fungsi adalah tipe yang kompatibel denganint
, pengembalian dari panggilan awal kemain
fungsi adalah setara dengan memanggilexit
fungsi dengan nilai yang dikembalikan olehmain
fungsi sebagai argumennya ". Itu C11; C89 / C90 memiliki kata-kata yang hampir sama.EXIT_SUCCESS
, tidak ada cara untuk mengembalikan status kegagalan spesifik platform dengan nilai 0, yang mungkin mengapa beberapa kompiler pada era diperlakukan kembali-dari-main danexit()
berbeda.Di C kembali dari
main
persis sama dengan meneleponexit
dengan nilai yang sama.Bagian 5.1.2.2.3 dari status standar C :
Aturan untuk C ++ sedikit berbeda seperti yang disebutkan dalam jawaban lain.
sumber
Sebenarnya ADA perbedaan antara
exit(0)
danreturn(0)
dimain
- ketikamain
fungsi Anda dipanggil beberapa kali.Program berikut
Jalankan sebagai
Akan menghasilkan output sebagai berikut:
Namun yang ini:
Tidak akan mencetak apa pun terlepas dari argumen.
Jika Anda yakin tidak akan ada yang memanggil Anda
main
secara eksplisit, secara teknis tidak ada perbedaan besar, tetapi untuk mempertahankan kode yang lebih jelasexit
akan terlihat jauh lebih baik. Jika Anda karena alasan tertentu ingin meneleponmain
- Anda harus menyesuaikannya dengan kebutuhan Anda.Berbicara tentang C.
sumber