Rumah >pembangunan bahagian belakang >C++ >Mengapa C Tidak Membuang Pengecualian untuk Pembahagian Integer dengan Sifar, dan Bagaimana Kami Boleh Mengendalikannya?

Mengapa C Tidak Membuang Pengecualian untuk Pembahagian Integer dengan Sifar, dan Bagaimana Kami Boleh Mengendalikannya?

DDD
DDDasal
2024-12-14 17:20:12324semak imbas

Why Doesn't C   Throw Exceptions for Integer Division by Zero, and How Can We Handle It?

Menangkap Pembahagian Masa Larian oleh Pengecualian Sifar

Pernyataan Masalah

Dalam coretan kod yang diberikan, pembahagian dengan sifar tidak mencetuskan pengecualian. Mengapakah ini berlaku dan bagaimanakah kita boleh memastikan pengecualian dilemparkan untuk ralat sedemikian?

Penjelasan

Tidak seperti ralat masa jalan biasa yang lain, pembahagian integer dengan sifar bukanlah pengecualian dalam standard C . Pembahagian titik terapung atau operasi baki juga tidak semestinya membuang pengecualian. Sebaliknya, operasi ini mempunyai tingkah laku yang tidak ditentukan apabila operan kedua adalah sifar. Ini bermakna sistem berkemungkinan berkelakuan tidak dapat diramalkan, termasuk melontar pengecualian, ranap program atau bahkan melakukan tindakan di luar skop program.

Melempar Pengecualian Tersuai

Memandangkan standard C tidak mengendalikan pembahagian dengan sifar sebagai pengecualian, pembangun mesti menyemak keadaan sedemikian secara manual dan membuang pengecualian tersuai jika perlu. Contohnya, seseorang boleh membuang overflow_error atau domain_error untuk menunjukkan pembahagian dengan ralat sifar.

Contoh Kod

Coretan kod yang diubah suai berikut menunjukkan cara menangkap pembahagian dengan pengecualian sifar menggunakan intDivEx tersuai fungsi:

#include <iostream>
#include <stdexcept>

// Integer division, catching divide by zero.
inline int intDivEx(int numerator, int denominator) {
    if (denominator == 0)
        throw std::overflow_error("Divide by zero exception");
    return numerator / denominator;
}

int main() {
    int i = 42;

    try {
        i = intDivEx(10, 0);
    } catch (std::overflow_error &amp;e) {
        std::cout << e.what() << " -> " << i << std::endl;
    }
    std::cout << i << std::endl;

    try {
        i = intDivEx(10, 2);
    } catch (std::overflow_error &amp;e) {
        std::cout << e.what() << " -> " << i << std::endl;
    }
    std::cout << i << std::endl;

    return 0;
}

Output:

Divide by zero exception -> 42
5

Kod ini dengan betul melempar dan menangkap pembahagian dengan pengecualian sifar, mengekalkan nilai asal i.

Atas ialah kandungan terperinci Mengapa C Tidak Membuang Pengecualian untuk Pembahagian Integer dengan Sifar, dan Bagaimana Kami Boleh Mengendalikannya?. 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