Apa cara yang benar (paling efisien) untuk mendefinisikan main()
fungsi dalam C dan C ++ - int main()
atau void main()
- dan mengapa? Jika int main()
kemudian return 1
atau return 0
?
Ada banyak duplikat dari pertanyaan ini, termasuk:
- Apa tanda tangan yang valid untuk
main()
fungsi C ? - Jenis pengembalian
main()
fungsi - Perbedaan antara
void main()
danint main()
? main()
Tanda tangan di C ++- Apa deklarasi yang tepat
main()
? - Untuk C ++, dengan jawaban yang sangat bagus. - Gaya
main()
fungsi dalam C - Jenis kembali
main()
metode dalam C int main()
vsvoid main()
dalam C
Terkait:
- C ++ -
int main(int argc, char **argv)
- C ++ -
int main(int argc, char *argv[])
- Apakah
char *envp[]
sebagai argumen ketiga untukmain()
portable? - Haruskah
int main()
fungsi mengembalikan nilai di semua kompiler? - Mengapa jenis
main()
fungsi dalam C dan C ++ diserahkan kepada pengguna untuk didefinisikan? - Mengapa
int main(){}
kompilasi? - Definisi hukum
main()
dalam C ++ 14?
c++
c
return-value
main
return-type
Joel
sumber
sumber
main
disebut sekali (dan dalam C ++ hanya bisa disebut sekali: tidak ada rekursi). Jika Anda tidak ingin eksekusi menghabiskan banyak waktumain
, maka jangan sering-sering memanggil program: buatlah program mengimplementasikan pengulangan.#include
pernyataanreturn
masukmain(...)
pada perangkat tertanam, sistem Anda masuk ke keadaan tidak terduga dan mesin cuci Anda akan menjadi sadar diri dan mencoba untuk membunuh Anda. Jadi, kami gunakanvoid main()
dalam kasus itu. Ini adalah praktik standar industri dalam bare-metal tertanam.Jawaban:
Nilai kembali untuk
main
menunjukkan bagaimana program keluar. Keluar normal diwakili oleh nilai balik 0 darimain
. Keluaran abnormal ditandai oleh pengembalian bukan nol, tetapi tidak ada standar untuk bagaimana kode bukan nol ditafsirkan. Sebagaimana dicatat oleh orang lain,void main()
dilarang oleh standar C ++ dan tidak boleh digunakan. Tandamain
tangan C ++ yang valid adalah:dan
yang setara dengan
Perlu juga dicatat bahwa dalam C ++,
int main()
dapat dibiarkan tanpa pernyataan-kembali, di mana pada saat itu default untuk mengembalikan 0. Ini juga benar dengan program C99. Apakahreturn 0;
harus dihilangkan atau tidak terbuka untuk diperdebatkan. Kisaran tanda tangan utama program C yang valid jauh lebih besar.Efisiensi bukan masalah dengan
main
fungsi. Ini hanya dapat dimasukkan dan dibiarkan satu kali (menandai awal dan penghentian program) sesuai dengan standar C ++. Untuk C, masuk kembalimain()
diperbolehkan, tetapi harus dihindari.sumber
Jawaban yang diterima tampaknya ditargetkan untuk C ++, jadi saya pikir saya akan menambahkan jawaban yang berkaitan dengan C, dan ini berbeda dalam beberapa cara.
ISO / IEC 9899: 1989 (C90):
main()
harus dinyatakan sebagai:Atau setara. Misalnya,
int main(int argc, char *argv[])
setara dengan yang kedua. Selanjutnya,int
tipe pengembalian dapat dihilangkan karena merupakan default.Jika suatu implementasi mengizinkannya,
main()
dapat dideklarasikan dengan cara lain, tetapi ini membuat implementasi program didefinisikan, dan tidak lagi sesuai secara ketat.Standar ini mendefinisikan 3 nilai untuk pengembalian yang benar-benar sesuai (yaitu, tidak bergantung pada implementasi perilaku yang ditetapkan):
0
danEXIT_SUCCESS
untuk penghentian yang berhasil, danEXIT_FAILURE
untuk penghentian yang tidak berhasil. Nilai-nilai lain tidak standar dan implementasi didefinisikan.main()
harus memilikireturn
pernyataan eksplisit di bagian akhir untuk menghindari perilaku yang tidak terdefinisi.Akhirnya, tidak ada yang salah dari sudut pandang standar dengan menelepon
main()
dari suatu program.ISO / IEC 9899: 1999 (C99):
Untuk C99, semuanya sama seperti di atas kecuali:
int
tipe kembali tidak dapat dihilangkan.main()
. Jika Anda melakukannya, danmain()
selesai, ada yang tersiratreturn 0
.sumber
Standar C - Lingkungan yang Diinangi
Untuk lingkungan yang dihosting (itu yang normal), standar C11 (ISO / IEC 9899: 2011) mengatakan:
Pengakhiran program dalam C99 atau C11
Nilai yang dikembalikan dari
main()
ditransmisikan ke 'lingkungan' dengan cara yang ditentukan implementasi.Catatan yang
0
diamanatkan sebagai 'sukses'. Anda dapat menggunakanEXIT_FAILURE
danEXIT_SUCCESS
dari<stdlib.h>
jika Anda mau, tetapi 0 sudah mapan, dan begitu juga 1. Lihat juga kode Keluar lebih besar dari 255 - mungkin? .Di C89 (dan karenanya di Microsoft C), tidak ada pernyataan tentang apa yang terjadi jika
main()
fungsi kembali tetapi tidak menentukan nilai kembali; oleh karena itu mengarah pada perilaku yang tidak terdefinisi.Standar C ++ - Lingkungan yang Diinangi
Standar C ++ 11 (ISO / IEC 14882: 2011) mengatakan:
Standar C ++ secara eksplisit mengatakan "Ini [fungsi utama] harus memiliki tipe tipe pengembalian
int
, tetapi jika tidak tipe implementasinya didefinisikan", dan memerlukan dua tanda tangan yang sama dengan standar C yang akan didukung sebagai opsi. Jadi 'void main ()' secara langsung tidak diizinkan oleh standar C ++, meskipun tidak ada yang bisa dilakukan untuk menghentikan implementasi non-standar yang memungkinkan alternatif. Perhatikan bahwa C ++ melarang pengguna meneleponmain
(tetapi standar C tidak).Ada sebuah paragraf dari §18.5 Start dan terminasi di C ++ 11 standar yang identik dengan paragraf dari §7.22.4.4 The
exit
fungsi dalam standar C11 (dikutip di atas), terpisah dari catatan kaki (yang hanya dokumen yangEXIT_SUCCESS
danEXIT_FAILURE
didefinisikan dalam<cstdlib>
).Standar C - Ekstensi Umum
Secara klasik, sistem Unix mendukung varian ketiga:
Argumen ketiga adalah daftar null yang diakhiri dari pointer ke string, yang masing-masing merupakan variabel lingkungan yang memiliki nama, tanda sama dengan, dan nilai (mungkin kosong). Jika Anda tidak menggunakan ini, Anda masih bisa masuk ke lingkungan melalui '
extern char **environ;
'. Variabel global ini unik di antara mereka yang ada di POSIX karena tidak memiliki header yang menyatakannya.Ini diakui oleh standar C sebagai perpanjangan umum, yang didokumentasikan dalam Lampiran J:
Microsoft C
The Microsoft VS 2010 compiler menarik. Situs web mengatakan:
Tidak jelas bagi saya apa yang terjadi (kode keluar apa yang dikembalikan ke induk atau OS) ketika program dengan
void main()
apakah keluar - dan situs web MS juga diam.Menariknya, MS tidak meresepkan versi dua argumen
main()
yang dibutuhkan oleh standar C dan C ++. Ini hanya menentukan bentuk argumen tiga di mana argumen ketiga adalahchar **envp
, pointer ke daftar variabel lingkungan.Halaman Microsoft juga mencantumkan beberapa alternatif lain -
wmain()
yang mengambil string karakter lebar, dan beberapa lagi.Microsoft Visual Studio 2005 versi halaman ini tidak daftar
void main()
sebagai alternatif. The versi dari Microsoft Visual Studio 2008 dan seterusnya lakukan.Standar C - Lingkungan Berdiri Bebas
Seperti disebutkan sebelumnya, persyaratan di atas berlaku untuk lingkungan yang dihosting. Jika Anda bekerja dengan lingkungan yang berdiri sendiri (yang merupakan alternatif untuk lingkungan yang dihosting), maka standar memiliki lebih sedikit untuk dikatakan. Untuk lingkungan yang berdiri sendiri, fungsi yang dipanggil saat startup program tidak perlu dipanggil
main
dan tidak ada batasan pada tipe pengembaliannya. Standar mengatakan:Referensi silang ke ayat 4 Kesesuaian mengacu pada ini:
Terlihat bahwa satu-satunya header yang diperlukan untuk lingkungan yang berdiri sendiri yang benar-benar mendefinisikan fungsi apa pun adalah
<stdarg.h>
(dan bahkan yang mungkin - dan seringkali - hanya makro).Standar C ++ - Lingkungan Berdiri Bebas
Sama seperti standar C yang mengenali lingkungan yang di-host dan berdiri bebas, demikian juga standar C ++. (Kutipan dari ISO / IEC 14882: 2011.)
Bagaimana dengan menggunakan
int main()
di C?Standar §5.1.2.2.1 dari standar C11 menunjukkan notasi yang disukai -
int main(void)
- tetapi ada juga dua contoh dalam standar yang menunjukkanint main()
: §6.5.3.4 ¶8 dan §6.7.6.3 ¶20 . Sekarang, penting untuk dicatat bahwa contoh tidak 'normatif'; mereka hanya ilustratif. Jika ada bug dalam contoh, mereka tidak secara langsung mempengaruhi teks utama standar. Yang mengatakan, mereka sangat menunjukkan perilaku yang diharapkan, jadi jika standar termasukint main()
dalam contoh, itu menunjukkan bahwaint main()
tidak dilarang, bahkan jika itu bukan notasi yang disukai.sumber
int main(){ … }
tidak menentukan bahwa fungsi tidak memerlukan argumen, tetapi tidak menyediakan prototipe fungsi, AFAICT. Untukmain()
itu jarang ada masalah; itu berarti bahwa jika Anda memiliki panggilan rekursifmain()
, argumen tidak akan diperiksa. Untuk fungsi lain, ini lebih merupakan masalah - Anda benar-benar membutuhkan prototipe dalam ruang lingkup ketika fungsi dipanggil untuk memastikan bahwa argumennya benar.main()
secara rekursif, di luar tempat-tempat seperti IOCCC. Saya punya program pengujian yang melakukannya - terutama untuk hal-hal baru. Jika Anda memilikiint i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }
dan mengkompilasi dengan GCC dan tidak termasuk-Wstrict-prototypes
, itu mengkompilasi dengan bersih di bawah peringatan ketat. Jika itumain(void)
, gagal dikompilasi.Saya percaya itu
main()
harus kembaliEXIT_SUCCESS
atauEXIT_FAILURE
. Mereka didefinisikan dalamstdlib.h
sumber
EXIT_SUCCESS
danEXIT_FAILURE
karena beberapa sistem operasi bersejarah (VMS?) Menggunakan angka yang berbeda dari 0 untuk menunjukkan kesuksesan. Ini 0 di mana-mana saat ini.exit(EXIT_SUCCESS)
, yang selalu melakukan hal yang benar.Perhatikan bahwa standar C dan C ++ mendefinisikan dua jenis implementasi: berdiri bebas dan dihosting.
Lingkungan yang diinangi C90
Formulir yang diizinkan 1 :
Komentar:
Dua yang pertama secara eksplisit dinyatakan sebagai bentuk yang diizinkan, yang lain secara implisit diizinkan karena C90 diizinkan "int implisit" untuk tipe kembali dan parameter fungsi. Tidak ada formulir lain yang diizinkan.
Lingkungan berdiri bebas C90
Bentuk atau nama utama apa pun diizinkan 2 .
Lingkungan yang diinangi C99
Formulir yang diizinkan 3 :
Komentar:
C99 menghapus "implisit int" sehingga
main()
tidak lagi valid.Kalimat aneh dan ambigu "atau dalam beberapa cara lain yang ditentukan implementasi" telah diperkenalkan. Ini dapat diartikan sebagai "parameter untuk
int main()
dapat bervariasi" atau sebagai "utama dapat memiliki bentuk yang ditentukan implementasi".Beberapa kompiler telah memilih untuk menafsirkan standar dengan cara yang terakhir. Dapat diperdebatkan, seseorang tidak dapat dengan mudah menyatakan bahwa mereka tidak benar-benar menyesuaikan diri dengan mengutip standar itu sendiri, karena itu ambigu.
Namun, untuk mengizinkan bentuk yang benar-benar liar
main()
mungkin (?) Bukan maksud dari kalimat baru ini. Dasar pemikiran C99 (bukan normatif) menyiratkan bahwa kalimat mengacu pada parameter tambahan keint main
4 .Namun bagian untuk penghentian program lingkungan yang dihosting kemudian melanjutkan perdebatan tentang kasus di mana main tidak kembali ke 5 . Meskipun bagian itu tidak normatif untuk bagaimana utama harus dideklarasikan, itu pasti menyiratkan bahwa utama dapat dinyatakan dengan cara yang sepenuhnya implementasi yang ditetapkan bahkan pada sistem host.
C99 lingkungan berdiri bebas
Bentuk atau nama utama apa pun diizinkan 6 .
Lingkungan host C11
Formulir yang diizinkan 7 :
C11 lingkungan berdiri bebas
Bentuk atau nama utama apa pun diizinkan 8 .
Catatan yang
int main()
tidak pernah terdaftar sebagai formulir yang valid untuk implementasi C yang di-host di salah satu versi di atas. Dalam C, tidak seperti C ++,()
dan(void)
memiliki arti yang berbeda. Yang pertama adalah fitur usang yang dapat dihapus dari bahasa. Lihat C11 arah bahasa masa depan:C ++ 03 lingkungan yang diinangi
Formulir yang diizinkan 9 :
Komentar:
Perhatikan tanda kurung kosong di formulir pertama. C ++ dan C berbeda dalam hal ini, karena dalam C ++ ini berarti bahwa fungsi tidak mengambil parameter. Tetapi dalam C itu berarti bahwa ia dapat mengambil parameter apa pun.
C ++ 03 lingkungan berdiri bebas
Nama fungsi yang dipanggil saat startup ditentukan oleh implementasi. Jika diberi nama
main()
harus mengikuti formulir 10 yang dinyatakan :C ++ 11 lingkungan yang diinangi
Formulir yang diizinkan 11 :
Komentar:
Teks standar telah diubah tetapi memiliki arti yang sama.
C ++ 11 lingkungan berdiri bebas
Nama fungsi yang dipanggil saat startup ditentukan oleh implementasi. Jika diberi nama
main()
harus mengikuti formulir yang dinyatakan 12 :Referensi
ANSI X3.159-1989 2.1.2.2 Lingkungan yang dihosting. "Program startup"
ANSI X3.159-1989 2.1.2.1 Lingkungan berdiri bebas:
ISO 9899: 1999 5.1.2.2 Lingkungan yang dihosting -> 5.1.2.2.1 Startup program
Dasar Pemikiran untuk Standar Internasional - Bahasa Pemrograman - C, Revisi 5.10. 5.1.2.2 Hosted environment -> 5.1.2.2.1 Startup program
ISO 9899: 1999 5.1.2.2 Lingkungan yang dihosting -> 5.1.2.2.3 Pengakhiran program
ISO 9899: 1999 5.1.2.1 Lingkungan berdiri bebas
ISO 9899: 2011 5.1.2.2 Hosted environment -> 5.1.2.2.1 Startup program
Bagian ini identik dengan C99 yang dikutip di atas.
ISO 9899: 1999 5.1.2.1 Lingkungan berdiri bebas
Bagian ini identik dengan C99 yang dikutip di atas.
ISO 14882: 2003 3.6.1 Fungsi utama
ISO 14882: 2003 3.6.1 Fungsi utama
ISO 14882: 2011 3.6.1 Fungsi utama
ISO 14882: 2011 3.6.1 Fungsi utama
Bagian ini identik dengan C ++ 03 yang dikutip di atas.
sumber
int my_startup_function ()
atauint my_startup_function (int argc, char *argv[])
tetapi dapatkah itu, misalnya:char my_startup_function (long argc, int *argv[])
sebagai fungsi startup juga? Saya kira tidak, bukan? Juga, bukankah itu ambigu juga?main()
karena dengan itu harus menggunakan salah satu tanda tangan yang terdaftar. Saya akan membayangkan yang paling umum adalahvoid my_startup_function ()
, karena tidak masuk akal untuk kembali dari program pada sistem berdiri bebas.main
juga? Maaf kalau itu bukan pertanyaan cerdas tapi saya tidak bisa memahami alasan di baliknya.func()
dianggap usang, rancangan itu sendiri menggunakanint main()
contoh-contohnya sendiri.Kembalikan 0 pada kesuksesan dan bukan nol untuk kesalahan. Ini adalah standar yang digunakan oleh skrip UNIX dan DOS untuk mencari tahu apa yang terjadi dengan program Anda.
sumber
main()
di C89 dan K&R C jenis pengembalian tidak ditentukan default ke 'int`.Jika Anda tidak menulis pernyataan pengembalian
int main()
, penutupan{
akan mengembalikan 0 secara default.return 0
ataureturn 1
akan diterima oleh proses induk. Dalam sebuah shell ia masuk ke variabel shell, dan jika Anda menjalankan program Anda membentuk sebuah shell dan tidak menggunakan variabel itu maka Anda tidak perlu khawatir tentang nilai pengembalianmain()
.Lihat Bagaimana saya bisa mendapatkan apa fungsi utama saya telah kembali? .
Dengan cara ini Anda dapat melihat bahwa itu adalah variabel
$?
yang menerima byte paling signifikan dari nilai pengembalianmain()
.Dalam skrip Unix dan DOS,
return 0
keberhasilan dan non-nol untuk kesalahan biasanya dikembalikan. Ini adalah standar yang digunakan oleh skrip Unix dan DOS untuk mencari tahu apa yang terjadi dengan program Anda dan mengendalikan seluruh aliran.sumber
$?
bukan variabel lingkungan; itu adalah variabel shell yang telah ditentukan (atau built-in). Perbedaannya sulit dikenali, tetapi jika Anda menjalankanenv
(tanpa argumen), ia mencetak lingkungan, dan$?
tidak akan ditampilkan di lingkungan.{
" seharusnya}
. SO tidak akan mengizinkan saya melakukan edit sekecil ini.Ingatlah bahwa, meskipun Anda mengembalikan int, beberapa OS (Windows) memotong nilai yang dikembalikan ke satu byte (0-255).
sumber
unsigned
). Ini sama pada sistem UNIX dengan integer 32-bit. Tetapi cangkang UNIX pada kedua sistem biasanya hanya akan mempertahankan bilangan bulat 8-bit yang tidak ditandatangani.Nilai kembali dapat digunakan oleh sistem operasi untuk memeriksa bagaimana program ditutup.
Nilai pengembalian 0 biasanya berarti OK di sebagian besar sistem operasi (yang bisa saya pikirkan).
Itu juga dapat diperiksa ketika Anda memanggil proses sendiri, dan melihat apakah program keluar dan selesai dengan benar.
Ini tidak hanya sebuah konvensi pemrograman.
sumber
Nilai pengembalian
main()
menunjukkan bagaimana program keluar. Jika nilai pengembaliannyazero
berarti eksekusi berhasil sementara nilai non-nol akan menyatakan bahwa ada yang tidak beres dalam eksekusi.sumber
Saya mendapat kesan bahwa standar menentukan bahwa utama tidak memerlukan nilai kembali karena pengembalian yang berhasil adalah berbasis OS (nol dalam satu bisa berupa keberhasilan atau kegagalan dalam yang lain), oleh karena itu tidak adanya pengembalian adalah isyarat untuk kompiler untuk memasukkan pengembalian yang berhasil itu sendiri.
Namun saya biasanya mengembalikan 0.
sumber
Kembali 0 harus memberi tahu programmer bahwa program telah berhasil menyelesaikan pekerjaan.
sumber
main()
biasanya sinyal kesalahan terjadi; mengembalikan 0 sinyal sukses. Jika program Anda selalu gagal, maka 1 OK, tetapi itu bukan ide terbaik.1
darimain
adalah implementasi-didefinisikan. Satu-satunya nilai yang didefinisikan bahasa adalah0
,EXIT_SUCCESS
(sering didefinisikan sebagai0
), danEXIT_FAILURE
. Di OpenVMS,return 1;
menunjukkan penghentian yang sukses .Menghilangkan
return 0
Ketika program C atau C ++ mencapai akhir
main
kompiler akan secara otomatis menghasilkan kode untuk mengembalikan 0, jadi tidak perlu menempatkanreturn 0;
secara eksplisit di akhirmain
.Catatan: ketika saya membuat saran ini, hampir selalu diikuti oleh salah satu dari dua jenis komentar: "Saya tidak tahu itu." atau "Itu saran yang buruk!" Alasan saya adalah aman dan bermanfaat untuk mengandalkan perilaku kompiler yang secara eksplisit didukung oleh standar. Untuk C, sejak C99; lihat ISO / IEC 9899: 1999 bagian 5.1.2.2.3:
Untuk C ++, sejak standar pertama pada tahun 1998; lihat ISO / IEC 14882: 1998 bagian 3.6.1:
Semua versi dari kedua standar sejak saat itu (C99 dan C ++ 98) mempertahankan gagasan yang sama. Kami mengandalkan fungsi anggota yang dibuat secara otomatis di C ++, dan beberapa orang menulis
return;
pernyataan eksplisit di akhirvoid
fungsi. Alasan untuk menghilangkan sepertinya mendidih menjadi "itu terlihat aneh" . Jika, seperti saya, Anda ingin tahu tentang alasan perubahan standar C membaca pertanyaan ini . Juga perhatikan bahwa pada awal 1990-an ini dianggap "praktik ceroboh" karena itu adalah perilaku yang tidak terdefinisi (meskipun didukung secara luas) pada saat itu.Selain itu, Pedoman Inti C ++ berisi beberapa instance dari menghilangkan
return 0;
pada akhirmain
dan tidak ada contoh di mana pengembalian eksplisit ditulis. Meskipun belum ada pedoman khusus tentang topik khusus ini dalam dokumen itu, yang tampaknya setidaknya merupakan dukungan diam-diam dari praktik tersebut.Jadi saya menganjurkan menghilangkannya; yang lain tidak setuju (sering dengan keras!) Dalam kasus apa pun, jika Anda menemukan kode yang menghilangkannya, Anda akan tahu bahwa itu secara eksplisit didukung oleh standar dan Anda akan tahu apa artinya.
sumber
return 0;
, namun saya akan mencatat bahwa banyak kompiler pada era itu juga menerapkan implisitreturn 0;
bahkan sebelum itu terstandarisasi.return 0
selama lebih dari satu dekade. Versi Microsoft C saat ini juga mendukungnya . Mungkin informasi Anda kedaluwarsa?Apa yang harus dikembalikan tergantung pada apa yang ingin Anda lakukan dengan executable. Misalnya jika Anda menggunakan program Anda dengan shell baris perintah, maka Anda harus mengembalikan 0 untuk sukses dan bukan nol untuk kegagalan. Maka Anda akan dapat menggunakan program dalam shell dengan pemrosesan bersyarat tergantung pada hasil kode Anda. Anda juga dapat menetapkan nilai bukan nol sesuai interpretasi Anda, misalnya untuk kesalahan kritis poin keluar program yang berbeda dapat menghentikan program dengan nilai keluar yang berbeda, dan yang tersedia untuk shell panggilan yang dapat memutuskan apa yang harus dilakukan dengan memeriksa nilai yang dikembalikan. Jika kode ini tidak dimaksudkan untuk digunakan dengan shell dan nilai yang dikembalikan tidak mengganggu siapa pun maka mungkin dihilangkan. Saya pribadi menggunakan tanda tangan
int main (void) { .. return 0; .. }
sumber
main
kompatibel denganint
. Oleh karena itu kembaliint
tidak akan menjadi masalah. Meskipun jenis pengembalian lainnya diperbolehkan, tetapi dalam hal itu variabel lingkungan yang memiliki nilai pengembalian tidak ditentukan. Tetapi jika seorang programmer melakukannyareturn 0;
maka dalam bash itu dapat digunakan untuk membuat cabang.Jika Anda benar-benar memiliki masalah yang terkait dengan efisiensi pengembalian integer dari suatu proses, Anda mungkin harus menghindari untuk memanggil proses itu berkali-kali sehingga nilai pengembalian ini menjadi masalah.
Jika Anda melakukan ini (panggil proses berkali-kali), Anda harus menemukan cara untuk menempatkan logika Anda langsung di dalam pemanggil, atau dalam file DLL, tanpa mengalokasikan proses khusus untuk setiap panggilan; alokasi beberapa proses membawa Anda masalah efisiensi yang relevan dalam kasus ini.
Secara terperinci, jika Anda hanya ingin tahu apakah pengembalian 0 lebih atau kurang efisien daripada mengembalikan 1, itu bisa bergantung dari kompiler dalam beberapa kasus, tetapi secara umum, dengan asumsi mereka dibaca dari sumber yang sama (lokal, bidang, konstan, disematkan dalam kode, hasil fungsi, dll.) ini membutuhkan jumlah siklus clock yang persis sama.
sumber
Berikut ini adalah demonstrasi kecil penggunaan kode pengembalian ...
Saat menggunakan berbagai alat yang disediakan oleh terminal Linux, seseorang dapat menggunakan kode pengembalian misalnya untuk penanganan kesalahan setelah proses selesai. Bayangkan file teks myfile berikut ada:
Ketika Anda menjalankan perintah grep, sebuah proses dibuat. Setelah melalui (dan tidak rusak) ia mengembalikan beberapa kode antara 0 dan 255. Misalnya:
Jika kamu melakukan
Anda akan mendapatkan 0. Mengapa? Karena grep menemukan kecocokan dan mengembalikan kode keluar 0, yang merupakan nilai biasa untuk keluar dengan sukses. Mari kita periksa lagi tetapi dengan sesuatu yang tidak ada di dalam file teks kita dan dengan demikian tidak ditemukan kecocokan:
Karena grep gagal mencocokkan token "foo" dengan konten file kami, kode pengembaliannya adalah 1 (ini adalah kasus biasa ketika kegagalan terjadi tetapi seperti yang dinyatakan di atas Anda memiliki banyak nilai untuk dipilih).
Sekarang skrip bash berikut (cukup ketik di terminal Linux) meskipun sangat mendasar harus memberikan beberapa ide penanganan kesalahan:
Setelah baris kedua tidak ada yang dicetak ke terminal karena "foo" membuat grep return 1 dan kami memeriksa apakah kode pengembalian grep sama dengan 0. Pernyataan bersyarat kedua menggemakan pesannya di baris terakhir karena benar karena LIHAT LIHAT == 1.
Seperti yang Anda lihat jika Anda memanggil ini dan itu proses itu kadang-kadang penting untuk melihat apa yang telah dikembalikan (dengan nilai pengembalian main ()).
sumber
if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi
- menguji status pengembalian secara langsung. Jika Anda ingin mengambil status (untuk pelaporan, dll), maka Anda menggunakan tugas. Anda mungkin menggunakanif grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fi
atau Anda mungkin menggunakan tiga baris. Anda mungkin juga menggunakan pilihan-s
dan-q
untukgrep
mencegah pertandingan atau pesan error rutin muncul. Namun, ini adalah shell minutiae - titik kunci, bahwa status keluar dapat bermanfaat - tidak masalah.Kata-kata "(paling efisien)" tidak mengubah pertanyaan. Kecuali Anda berada di lingkungan yang berdiri sendiri, ada satu cara universal yang benar untuk menyatakan
main()
, dan itu adalah mengembalikan int.Ini bukan apa yang harus
main()
kembali, itu apa yang dilakukannyamain()
kembali.main()
tentu saja adalah fungsi yang dipanggil orang lain. Anda tidak memiliki kendali atas kode yang memanggilmain()
. Karena itu, Anda harus mendeklarasikanmain()
dengan tanda tangan yang benar untuk mencocokkan peneleponnya. Anda tidak punya pilihan dalam masalah ini. Anda tidak perlu bertanya pada diri sendiri apa yang lebih atau kurang efisien, atau apa gaya yang lebih baik atau lebih buruk, atau apa pun seperti itu, karena jawabannya sudah didefinisikan dengan sangat baik, untuk Anda, oleh standar C dan C +. Ikuti saja mereka.0 untuk sukses, bukan nol untuk kegagalan. Sekali lagi, bukan sesuatu yang Anda perlu (atau mulai) pilih: itu ditentukan oleh antarmuka yang seharusnya Anda sesuaikan.
sumber