Rumah > pembangunan bahagian belakang > C++ > Mengapa C Tidak Melemparkan Pengecualian untuk Integer Divide-by-Zero?

Mengapa C Tidak Melemparkan Pengecualian untuk Integer Divide-by-Zero?

Mary-Kate Olsen
Lepaskan: 2024-12-25 08:03:14
asal
119 orang telah melayarinya

Why Doesn't C   Throw an Exception for 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();
}
Salin selepas log masuk

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
Salin selepas log masuk

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan