ホームページ > バックエンド開発 > C++ > C が整数のゼロ除算で例外をスローしないのはなぜですか?また、それをどのように処理すればよいでしょうか?

C が整数のゼロ除算で例外をスローしないのはなぜですか?また、それをどのように処理すればよいでしょうか?

DDD
リリース: 2024-12-14 17:20:12
オリジナル
323 人が閲覧しました

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

実行時ゼロ除算例外のキャッチ

問題ステートメント

指定されたコード スニペットでは、ゼロ除算は例外をトリガーしません。これはなぜ起こるのでしょうか?また、そのようなエラーに対して例外が確実にスローされるようにするにはどうすればよいですか?

説明

他の一般的なランタイム エラーとは異なり、標準 C では整数のゼロ除算は例外ではありません。浮動小数点の除算または剰余演算も、本質的に例外をスローしません。代わりに、2 番目のオペランドがゼロの場合、これらの操作は未定義の動作をします。これは、システムが例外のスロー、プログラムのクラッシュ、さらにはプログラムの範囲外のアクションの実行など、予期しない動作を行う可能性があることを意味します。

カスタム例外のスロー

標準 C では処理できないためゼロによる除算が例外として発生する場合、開発者はそのような条件を手動でチェックし、必要に応じてカスタム例外をスローする必要があります。たとえば、overflow_error または domain_error をスローして、ゼロ除算エラーを示すことができます。

コード例

次の変更されたコード スニペットは、カスタム intDivEx を使用してゼロ除算例外をキャッチする方法を示しています。関数:

#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;
}
ログイン後にコピー

出力:

Divide by zero exception -> 42
5
ログイン後にコピー

このコードは正しくありますi の元の値を保持しながら、ゼロ除算例外をスローおよびキャッチします。

以上がC が整数のゼロ除算で例外をスローしないのはなぜですか?また、それをどのように処理すればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート