Maison >développement back-end >C++ >Pourquoi C ne lève-t-il pas d'exception pour la division entière par zéro ?

Pourquoi C ne lève-t-il pas d'exception pour la division entière par zéro ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 08:03:14121parcourir

Why Doesn't C   Throw an Exception for Integer Divide-by-Zero?

Attraper les exceptions Divide-by-Zero

Malgré les tentatives d'interception d'une exception à l'aide d'un bloc try/catch, le code suivant contourne inexplicablement le exception lors de la division par zéro :

int i = 0;

cin >> i; // input validation not present

try {
    i = 5/i;
}
catch (std::logic_error e) {

    cerr << e.what();
}

Gestion des exceptions en C

Contrairement aux attentes, la division entière par zéro n'est pas une exception intégrée au standard C . Cela est également vrai pour la division/reste en virgule flottante par zéro, bien que dans ce cas, des valeurs rationnelles spécifiques telles que NaN/Inf puissent en résulter.

La liste des exceptions définies dans la norme ISO C 20 comprend :

logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow_error
underflow_error

Bien que des arguments puissent être avancés en faveur de l'utilisation de overflow_error ou domain_error pour indiquer une division par zéro, la norme indique explicitement que le comportement n'est pas défini dans de tels cas.

Gestion personnalisée des exceptions

Si une exception de division par zéro est souhaitée, elle peut être implémentée manuellement. L'exemple suivant utilise la fonction intDivEx pour diviser des entiers avec gestion des exceptions :

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

Le résultat de l'utilisation de cette fonction démontre l'exception levée et interceptée, laissant la variable d'origine intacte dans le cas d'une division par -zéro :

i = intDivEx(10, 0); // throws exception

i = intDivEx(10, 2); // returns 5

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn