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
Mary-Kate Olsenasal
2024-12-25 08:03:14121semak imbas

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();
}

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!

Kenyataan:
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