Rumah >pembangunan bahagian belakang >C++ >Mengapa C Tidak Melemparkan Pengecualian untuk Integer Divide-by-Zero?
Menangkap Pengecualian Divide-by-Zero
Walaupun percubaan untuk menangkap pengecualian menggunakan blok cuba/tangkap, kod berikut secara tidak jelas memintas pengecualian apabila membahagi dengan sifar:
int i = 0; cin >> i; // input validation not present try { i = 5/i; } catch (std::logic_error e) { cerr << e.what(); }
Pengendalian Pengecualian dalam C
Bertentangan dengan jangkaan, pembahagian integer dengan sifar bukanlah pengecualian terbina dalam dalam standard C . Ini juga benar untuk pembahagian titik terapung/baki sebanyak sifar, walaupun dalam kes ini, nilai rasional tertentu seperti NaN/Inf mungkin terhasil.
Senarai pengecualian yang ditakrifkan dalam standard ISO C 20 termasuk:
logic_error domain_error invalid_argument length_error out_of_range runtime_error range_error overflow_error underflow_error
Walaupun hujah boleh dibuat untuk menggunakan overflow_error atau domain_error untuk menunjukkan pembahagian dengan sifar, standard secara eksplisit menyatakan bahawa tingkah laku tidak ditentukan dalam kes sedemikian.
Pengendalian Pengecualian Tersuai
Jika pengecualian bahagi dengan sifar dikehendaki, ia boleh dilaksanakan secara manual. Contoh berikut menggunakan fungsi intDivEx untuk membahagikan integer dengan pengendalian pengecualian:
inline int intDivEx (int numerator, int denominator) { if (denominator == 0) throw std::overflow_error("Divide by zero exception"); return numerator / denominator; }
Output menggunakan fungsi ini menunjukkan pengecualian dilemparkan dan ditangkap, meninggalkan pembolehubah asal tidak disentuh dalam kes pembahagian dengan -sifar:
i = intDivEx(10, 0); // throws exception i = intDivEx(10, 2); // returns 5
Atas ialah kandungan terperinci Mengapa C Tidak Melemparkan Pengecualian untuk Integer Divide-by-Zero?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!