Cara mengakhiri kode C ++


267

Saya ingin kode C ++ saya berhenti berjalan jika kondisi tertentu terpenuhi, tetapi saya tidak yakin bagaimana melakukannya. Jadi kapan saja jika sebuah ifpernyataan benar, hentikan kode seperti ini:

if (x==1)
{
    kill code;
}

98
Gunakan logika yang tepat. Dalam main()pengembalian digunakan, dalam fungsi menggunakan nilai pengembalian yang tepat atau membuang Pengecualian yang tepat. Jangan gunakan exit()!
kay - SE jahat

6
@ JonathanLeffler: Ketika dikompilasi dengan NDEBUGdidefinisikan, assertkemungkinan akan menjadi no-op, jadi Anda tidak harus bergantung padanya untuk lebih dari mendeteksi bug.
MvG

13
@ jamesqf: a returnfrom main()sangat logis. Ini menetapkan kode keluar yang dilaporkan oleh program ke sistem operasi, yang dapat berguna dalam banyak kasus (jika program Anda dapat digunakan sebagai bagian dari proses yang lebih besar, misalnya).
AAT

11
Menariknya Q ini adalah duplikat dari yang ini dari 5 tahun yang lalu, yang jawaban yang diterima sangat berbeda: stackoverflow.com/questions/1116493/how-to-quit-ac-program Saya kira butuh komunitas 5 tahun untuk belajar secara membabi buta memanggil std :: exit mungkin buruk?
Brandin

5
Pertanyaan Mengapa menggunakan exit()dianggap buruk? - SO 25141737 dan Bagaimana cara keluar dari program C ++? - SO 1116493 sekarang ditutup sebagai duplikat dari yang ini. Yang pertama memiliki referensi ke 'Crash-only Software' yang mungkin layak untuk dilihat, jika hanya untuk merangsang pemikiran Anda tentang cara menulis perangkat lunak yang kuat.
Jonathan Leffler

Jawaban:


431

Ada beberapa cara, tetapi pertama-tama Anda harus memahami mengapa pembersihan objek itu penting, dan karenanya alasannya std::exitterpinggirkan di antara programmer C ++.

RAII dan Stack Unwinding

C ++ memanfaatkan idiom yang disebut RAII , yang secara sederhana berarti objek harus melakukan inisialisasi pada konstruktor dan pembersihan pada destruktor. Misalnya std::ofstreamkelas [boleh] membuka file selama konstruktor, kemudian pengguna melakukan operasi output di atasnya, dan akhirnya pada akhir siklus hidupnya, biasanya ditentukan oleh cakupannya, destruktor disebut yang pada dasarnya menutup file dan memerah setiap konten tertulis ke dalam disk.

Apa yang terjadi jika Anda tidak sampai ke destructor untuk menyiram dan menutup file? Siapa tahu! Tapi mungkin itu tidak akan menulis semua data yang seharusnya ditulis ke dalam file.

Sebagai contoh, pertimbangkan kode ini

#include <fstream>
#include <exception>
#include <memory>

void inner_mad()
{
    throw std::exception();
}

void mad()
{
    auto ptr = std::make_unique<int>();
    inner_mad();
}

int main()
{
    std::ofstream os("file.txt");
    os << "Content!!!";

    int possibility = /* either 1, 2, 3 or 4 */;

    if(possibility == 1)
        return 0;
    else if(possibility == 2)
        throw std::exception();
    else if(possibility == 3)
        mad();
    else if(possibility == 4)
        exit(0);
}

Apa yang terjadi di setiap kemungkinan adalah:

  • Kemungkinan 1: Kembali pada dasarnya meninggalkan ruang lingkup fungsi saat ini, sehingga ia tahu tentang akhir siklus hidup ossehingga memanggil destruktornya dan melakukan pembersihan yang tepat dengan menutup dan menyiram file ke disk.
  • Kemungkinan 2: Melempar pengecualian juga menangani siklus hidup objek dalam lingkup saat ini, sehingga melakukan pembersihan yang tepat ...
  • Kemungkinan 3: Di sini tumpukan unwinding mulai beraksi! Meskipun pengecualian dilemparkan pada inner_mad, pelepas akan pergi melalui tumpukan maddan mainuntuk melakukan pembersihan yang tepat, semua objek akan dihancurkan dengan benar, termasuk ptrdan os.
  • Kemungkinan 4: Nah, ini? exitadalah fungsi C dan tidak disadari atau kompatibel dengan idiom C ++. Itu tidak melakukan pembersihan pada objek Anda, termasuk osdalam cakupan yang sama. Jadi file Anda tidak akan ditutup dengan benar dan karena alasan ini kontennya mungkin tidak akan pernah ditulis ke dalamnya!
  • Kemungkinan lain: Ini hanya akan meninggalkan ruang lingkup utama, dengan melakukan implisit return 0dan dengan demikian memiliki efek yang sama dengan kemungkinan 1, yaitu pembersihan yang tepat.

Tapi jangan terlalu yakin tentang apa yang saya katakan (terutama kemungkinan 2 dan 3); lanjutkan membaca dan kami akan mencari tahu cara melakukan pembersihan berdasarkan pengecualian yang tepat.

Kemungkinan Cara Untuk Mengakhiri

Kembali dari main!

Anda harus melakukan ini bila memungkinkan; selalu lebih suka untuk kembali dari program Anda dengan mengembalikan status keluar yang tepat dari utama.

Penelepon program Anda, dan mungkin sistem operasi, mungkin ingin tahu apakah program Anda seharusnya dilakukan dengan sukses atau tidak. Untuk alasan yang sama ini, Anda harus mengembalikan nol atau EXIT_SUCCESSuntuk memberi sinyal bahwa program berhasil dihentikan dan EXIT_FAILUREuntuk memberi sinyal program tidak berhasil, bentuk lain dari nilai pengembalian ditentukan oleh implementasi ( §18.5 / 8 ).

Namun Anda mungkin sangat dalam di tumpukan panggilan, dan mengembalikan semuanya mungkin menyakitkan ...

[Jangan] melempar pengecualian

Melempar pengecualian akan melakukan pembersihan objek yang tepat menggunakan stack unwinding, dengan memanggil destruktor dari setiap objek dalam cakupan sebelumnya.

Tapi inilah tujuannya ! Ini ditentukan oleh implementasi apakah stack unwinding dilakukan ketika pengecualian yang dilempar tidak ditangani (dengan klausa catch (...)) atau bahkan jika Anda memiliki noexceptfungsi di tengah tumpukan panggilan. Hal ini dinyatakan dalam §15.5.1 [except.terminate] :

  1. Dalam beberapa situasi penanganan pengecualian harus ditinggalkan untuk teknik penanganan kesalahan yang kurang halus. [Catatan: Situasi ini adalah:

    [...]

    - ketika mekanisme penanganan pengecualian tidak dapat menemukan pawang untuk pengecualian yang dilemparkan (15.3), atau ketika pencarian untuk pawang (15.3) menemukan blok terluar dari fungsi dengan noexceptspesifikasi- yang tidak memungkinkan pengecualian (15.4), atau [...]

    [...]

  2. Dalam kasus seperti itu, std :: terminate () disebut (18.8.3). Dalam situasi di mana tidak ada handler yang cocok ditemukan, itu adalah implementasi yang ditentukan apakah stack dibatalkan atau tidak sebelum std :: terminate () disebut [...]

Jadi kita harus menangkapnya!

Jangan melempar pengecualian dan menangkapnya di main!

Karena pengecualian tanpa tertangkap mungkin tidak melakukan stack unwinding (dan akibatnya tidak akan melakukan pembersihan yang benar) , kita harus menangkap pengecualian di main dan kemudian mengembalikan status keluar ( EXIT_SUCCESSatau EXIT_FAILURE).

Jadi pengaturan yang mungkin bagus adalah:

int main()
{
    /* ... */
    try
    {
        // Insert code that will return by throwing a exception.
    }
    catch(const std::exception&)  // Consider using a custom exception type for intentional
    {                             // throws. A good idea might be a `return_exception`.
        return EXIT_FAILURE;
    }
    /* ... */
}

[Jangan] std :: keluar

Ini tidak melakukan segala macam tumpukan bersantai, dan tidak ada objek hidup di tumpukan akan memanggil destructor masing-masing untuk melakukan pembersihan.

Ini diberlakukan di §3.6.1 / 4 [basic.start.init] :

Mengakhiri program tanpa meninggalkan blok saat ini (misalnya, dengan memanggil fungsi std :: exit (int) (18.5)) tidak menghancurkan objek apa pun dengan durasi penyimpanan otomatis (12.4) . Jika std :: exit dipanggil untuk mengakhiri program selama penghancuran objek dengan durasi penyimpanan statis atau thread, program memiliki perilaku yang tidak ditentukan.

Pikirkan sekarang, mengapa Anda melakukan hal seperti itu? Berapa banyak benda yang telah Anda rusak sangat menyakitkan?

Alternatif [seburuk] lainnya

Ada cara lain untuk menghentikan program (selain mogok) , tetapi mereka tidak disarankan. Hanya demi klarifikasi, mereka akan disajikan di sini. Perhatikan bagaimana terminasi program yang normal tidak berarti stack unwinding tetapi keadaan oke untuk sistem operasi.

  • std::_Exit menyebabkan penghentian program normal, dan hanya itu.
  • std::quick_exitmenyebabkan penghentian program normal dan memanggil std::at_quick_exitpenangan, tidak ada pembersihan lainnya dilakukan.
  • std::exitmenyebabkan penghentian program normal dan kemudian memanggil std::atexitpenangan. Jenis pembersihan lainnya dilakukan seperti memanggil destruktor objek statis.
  • std::abortmenyebabkan penghentian program yang tidak normal, tidak ada pembersihan yang dilakukan. Ini harus dipanggil jika program diakhiri dengan cara yang benar-benar tidak terduga. Ini tidak akan melakukan apa-apa selain memberi sinyal pada OS tentang penghentian abnormal. Beberapa sistem melakukan dump inti dalam kasus ini.
  • std::terminatepanggilan panggilan std::terminate_handlermana yang std::abortsecara default.

25
Ini cukup informatif: terutama saya tidak pernah menyadari bahwa melempar pengecualian yang tidak ditangani di mana saja (misalnya: beberapa newmelempar std::bad_allocdan program Anda lupa menangkap pengecualian itu di mana saja) tidak akan melepaskan tumpukan dengan benar sebelum mengakhiri. Hal ini tampaknya konyol bagi saya: itu akan menjadi mudah untuk dasarnya membungkus panggilan untuk maindalam sepele try{- }catch(...){}blok yang akan memastikan tumpukan unwinding benar dilakukan dalam kasus tersebut, tanpa biaya (oleh yang saya berarti: program tidak menggunakan ini akan membayar tidak penalti). Apakah ada alasan khusus ini tidak dilakukan?
Marc van Leeuwen

12
@MarcvanLeeuwen salah satu alasan yang mungkin adalah debugging: Anda ingin membobol debugger segera setelah pengecualian yang tidak ditangani dilemparkan. Mengurai tumpukan dan melakukan pembersihan akan menghapus konteks penyebab crash yang ingin Anda debug. Jika tidak ada debugger, mungkin lebih baik membuang inti sehingga analisis postmortem dapat dilakukan.
Hugh Allen

11
Kadang-kadang browser saya bug (saya menyalahkan flash) dan mengkonsumsi beberapa gigabytes RAM dan OS saya membuang halaman pada hard drive membuat semuanya lambat. Ketika saya menutup browser, ia melakukan stack yang benar, artinya semua gigabyte RAM dibaca dari hard-drive dan disalin ke memori hanya untuk dirilis, yang membutuhkan waktu sekitar satu menit. Saya sangat berharap mereka telah menggunakannya std::abortsebagai gantinya OS dapat melepaskan semua memori, soket dan deskriptor file tanpa bertukar selama satu menit.
nwp

2
@ nwp, saya mengerti perasaan itu. Tapi membunuh secara instan dapat merusak file, tidak menyimpan tab terbaru saya, dll :)
Paul Draper

2
@ PaulDraper Saya tentu tidak akan menganggapnya bisa ditoleransi jika browser tidak dapat mengembalikan tab yang saya buka sebelum kehilangan daya. Tentu saja jika saya baru saja membuka tab, dan belum punya waktu untuk menyimpannya, itu akan hilang. Tapi selain itu, saya katakan tidak ada alasan untuk kehilangan itu.
kasperd

61

Seperti yang disebutkan Martin York, exit tidak melakukan pembersihan yang diperlukan seperti pengembalian.

Itu selalu lebih baik untuk menggunakan pengembalian di tempat keluar. Jika Anda tidak berada di utama, di mana pun Anda ingin keluar dari program, kembali ke utama terlebih dahulu.

Perhatikan contoh di bawah ini. Dengan program berikut, sebuah file akan dibuat dengan konten yang disebutkan. Tetapi jika return dikomentari & keluar tanpa komentar (0), kompiler tidak meyakinkan Anda bahwa file tersebut akan memiliki teks yang diperlukan.

int main()
{
    ofstream os("out.txt");
    os << "Hello, Can you see me!\n";
    return(0);
    //exit(0);
}

Bukan hanya ini, Memiliki beberapa titik keluar dalam suatu program akan membuat proses debug lebih sulit. Gunakan keluar hanya jika itu bisa dibenarkan.


2
Apa yang Anda rekomendasikan untuk mencapai perilaku ini dalam program yang sedikit lebih besar? Bagaimana Anda selalu kembali ke main bersih jika suatu tempat kode yang lebih dalam kondisi kesalahan dipicu yang harus keluar dari program?
Janusz

5
@ Janusz, Dalam hal ini, Anda dapat menggunakan / melempar pengecualian, jika tidak mengembalikan nilai yang ditentukan sebelumnya yaitu, memiliki nilai kembali dari fungsi, seperti misalnya mengembalikan 0 ketika berhasil, 1 dalam kasus kegagalan, tetapi melanjutkan eksekusi , -1 jika gagal & keluar dari program. Berdasarkan nilai kembali dari fungsi, jika itu gagal, cukup kembali dari utama setelah melakukan aktivitas pembersihan lagi. Akhirnya, gunakan keluar dengan bijaksana, saya tidak bermaksud menghindarinya.
Narendra N

1
@ NarendraN, "pembersihan yang diperlukan" tidak jelas - OS akan menangani (Windows / Linux) bahwa memori dan file menangani dirilis dengan benar. Adapun output file "hilang": Jika Anda bersikeras bahwa ini bisa menjadi masalah nyata, lihat stackoverflow.com/questions/14105650/how-does-stdflush-work Jika Anda memiliki kondisi kesalahan, logging yang tepat memberitahu Anda bahwa program Anda mencapai kondisi yang tidak ditentukan dan Anda dapat mengatur breakpoint tepat sebelum titik logging Anda. Bagaimana hal itu membuat debugging lebih sulit?
Markus

2
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler

untuk modern C ++ menggunakan return (EXIT_SUCCESS);bukannyareturn(0)
Jonas Stein

39

Panggil std::exitfungsinya.   


2
Penghancur objek mana yang dipanggil saat Anda memanggil fungsi itu?
Rob Kennedy

37
keluar () tidak kembali. Jadi tidak ada tumpukan yang bisa terjadi. Bahkan objek global pun tidak bisa dihancurkan. Tetapi fungsi yang terdaftar pada atexit () akan dipanggil.
Martin York

16
Tolong jangan panggil exit()ketika kode perpustakaan Anda berjalan di dalam proses host saya - yang terakhir akan keluar di antah berantah.
sharptooth

5
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler

23

Orang-orang mengatakan "panggilan keluar (kode pengembalian)," tetapi ini adalah bentuk yang buruk. Dalam program kecil tidak masalah, tetapi ada beberapa masalah dengan ini:

  1. Anda akan mendapatkan banyak titik keluar dari program
  2. Itu membuat kode lebih berbelit-belit (seperti menggunakan goto)
  3. Itu tidak dapat melepaskan memori yang dialokasikan saat runtime

Sungguh, satu-satunya waktu Anda harus keluar dari masalah adalah dengan baris ini di main.cpp:

return 0;

Jika Anda menggunakan exit () untuk menangani kesalahan, Anda harus belajar tentang pengecualian (dan pengecualian bertumpuk), sebagai metode yang jauh lebih elegan dan aman.


9
Dalam lingkungan multi-utas, pengecualian yang dilemparkan ke utas berbeda tidak akan ditangani meskipun utama () - beberapa komunikasi lintas-thread manual diperlukan sebelum utas bawahan kedaluwarsa.
Steve Gilham

3
1. dan 2. terserah programmer, dengan pencatatan yang benar ini bukan masalah karena penghentian berhenti selamanya. Adapun 3: Itu hanya salah, OS akan membebaskan memori - mungkin tidak termasuk perangkat yang tertanam / realtime, tetapi jika Anda melakukan itu, Anda mungkin tahu barang-barang Anda.
Markus

1
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler

1
Namun, jika terjadi kesalahan, Anda seharusnya tidak mengembalikan 0. Anda harus mengembalikan 1 (atau mungkin beberapa nilai lain, tetapi 1 selalu merupakan pilihan yang aman).
Kef Schecter

14

return 0;letakkan di mana pun Anda inginkan di dalam int main()dan program akan segera ditutup.


the-nightman, @ evan-carslake, dan yang lainnya, saya juga akan menambahkan bahwa pertanyaan SO # 36707 ini memberikan diskusi tentang apakah pernyataan kembali hanya terjadi di mana saja dalam rutinitas. Ini solusinya; Namun, tergantung pada situasi spesifik, saya tidak akan mengatakan ini adalah solusi terbaik.
localhost

1
OP tidak mengatakan apa-apa tentang ini, jadi saya pikir agak terburu-buru untuk menganggap kode itu dimaksudkan berada di dalam fungsi main.
Marc van Leeuwen

@ localhost Pernyataan pengembalian sepenuhnya opsional dalam setiap situasi, dalam kondisi apa pun. Namun int main()berbeda. Program ini digunakan int main()untuk memulai dan mengakhiri. Tidak ada cara lain untuk melakukannya. Program akan berjalan sampai Anda mengembalikan benar atau salah. Hampir sepanjang waktu Anda akan mengembalikan 1 atau true, untuk menunjukkan program telah ditutup dengan benar (mis: mungkin menggunakan false jika Anda tidak dapat mengosongkan memori atau alasan apa pun.) Membiarkan program berjalan sendiri selesai selalu merupakan ide yang buruk, contoh:int main() { int x = 2; int foo = x*5; std::cout << "blah"; }
Evan Carslake

@ EvanCarslake Dipahami, jika Anda memperhatikan komentar yang saya posting di tempat lain untuk pertanyaan ini, saya tahu tentang hal ini int main; Namun, tidak selalu merupakan ide yang baik untuk memiliki beberapa pernyataan pengembalian dalam rutinitas utama. Satu peringatan potensial adalah untuk meningkatkan keterbacaan kode; Namun, menggunakan sesuatu seperti bendera boolean yang mengubah status untuk mencegah bagian kode tertentu dari kode dalam keadaan aplikasi itu. Secara pribadi, saya menemukan pernyataan pengembalian yang umum membuat sebagian besar aplikasi lebih mudah dibaca. Terakhir, pertanyaan tentang pembersihan memori dan menutup objek I / O dengan benar sebelum keluar.
localhost

2
@EvanCarslake Anda tidak kembali truedari mainuntuk menunjukkan penghentian yang benar. Anda harus mengembalikan nol atau EXIT_SUCCESS(atau, jika Anda mau false,, yang akan secara implisit dikonversi menjadi nol) untuk menunjukkan penghentian normal. Untuk menunjukkan kegagalan, Anda dapat kembali EXIT_FAILURE. Arti kode lainnya adalah implementasi-didefinisikan (pada sistem POSIX itu berarti kode kesalahan aktual).
Ruslan

11

Program akan berakhir ketika aliran eksekusi mencapai akhir dari fungsi utama.

Untuk menghentikannya sebelum itu, Anda dapat menggunakan fungsi exit (int status), di mana status adalah nilai yang dikembalikan ke apa pun yang memulai program. 0 biasanya menunjukkan keadaan non-kesalahan


2
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler

11

Baik mengembalikan nilai dari Anda mainatau menggunakan exitfungsi. Keduanya mengambil int. Tidak masalah apa nilai yang Anda kembalikan kecuali Anda memiliki proses eksternal mengawasi nilai pengembalian.


3
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler


9

Umumnya Anda akan menggunakan exit()metode ini dengan status keluar yang sesuai .

Nol berarti sukses. Status bukan-nol menunjukkan beberapa jenis masalah telah terjadi. Kode keluar ini digunakan oleh proses induk (mis. Skrip shell) untuk menentukan apakah suatu proses telah berhasil dijalankan.


1
menggunakan exit MUNGKIN berarti Anda memiliki masalah desain. Jika sebuah program mengaitkannya dengan benar, maka program itu harus diakhiri saat main return 0;. Saya berasumsi exit()seperti assert(false);dan harus digunakan hanya dalam pengembangan untuk menangkap masalah awal.
CoffeDeveloper

2
Perhatikan bahwa jawaban ini digabungkan dari pertanyaan Bagaimana cara keluar dari program C ++? - SO 1116493 . Jawaban ini ditulis kira-kira 6 tahun sebelum pertanyaan ini diajukan.
Jonathan Leffler

7

Melampaui panggilan keluar (error_code) - yang memanggil penangan atexit, tetapi bukan RAII destructors, dll. - semakin banyak saya menggunakan pengecualian.

Sepertinya semakin banyak program utama saya

int main(int argc, char** argv) 
{
    try {
        exit( secondary_main(argc, argv );
    }
    catch(...) {
        // optionally, print something like "unexpected or unknown exception caught by main"
        exit(1);
    }
}

di mana secondary_main di mana semua hal-hal yang semula diletakkan - yaitu main asli diganti namanya secondary_main, dan stub main di atas ditambahkan. Ini hanya keramahtamahan, sehingga tidak ada terlalu banyak kode antara baki dan menangkap utama.

Jika Anda mau, tangkap jenis pengecualian lainnya.
Saya sangat suka menangkap tipe kesalahan string, seperti std :: string atau char *, dan mencetaknya di catch handler di main.

Menggunakan pengecualian seperti ini setidaknya memungkinkan destruktor RAII dipanggil, sehingga mereka dapat melakukan pembersihan. Yang bisa menyenangkan dan bermanfaat.

Secara keseluruhan, penanganan kesalahan C - keluar dan sinyal - dan penanganan kesalahan C ++ - kecuali mencoba / menangkap / melempar - bermain bersama secara tidak konsisten.

Lalu, di mana Anda mendeteksi kesalahan

throw "error message"

atau beberapa tipe pengecualian yang lebih spesifik.


Omong-omong: Saya sangat menyadari bahwa menggunakan tipe data seperti string, yang mungkin melibatkan alokasi memori dinamis, bukan ide yang baik di dalam atau di sekitar penangan pengecualian untuk pengecualian yang mungkin terkait dengan kehabisan memori. Konstanta string gaya-C tidak menjadi masalah.
Krazy Glew

1
Tidak ada gunanya memanggil exitprogram Anda. Karena Anda masuk main, Anda bisa saja return exitCode;.
Ruslan

-1

Jika pernyataan if Anda di Loop Anda dapat menggunakan

 break; 

Jika Anda ingin keluar dari beberapa kode & lanjut ke loop Gunakan:

terus;

Jika pernyataan if Anda tidak di Loop, Anda dapat menggunakan:

 return 0;

Or 




  exit();

-2

Bung ... exit()fungsi didefinisikan di bawah stdlib.h

Jadi, Anda perlu menambahkan preprocessor.

Taruh include stdlib.hdi bagian header

Kemudian gunakan di exit();mana pun Anda suka, tetapi ingatlah untuk memasukkan nomor interger di dalam kurung pintu keluar.

sebagai contoh:

exit(0);

-2

Jika kondisi yang saya uji adalah berita buruk, saya melakukan ini:

*(int*) NULL= 0;

Ini memberi saya coredump bagus dari mana saya bisa memeriksa situasi.


4
Ini mungkin dioptimalkan, karena hal itu menyebabkan perilaku yang tidak terdefinisi. Bahkan, seluruh cabang eksekusi yang memiliki pernyataan seperti itu dapat dimusnahkan oleh kompiler.
Ruslan

-2

Untuk memecahkan suatu kondisi, gunakan return (0);

Jadi, dalam kasus Anda itu adalah:

    if(x==1)
    {
        return 0;
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.