[解決済み] d == 0 のとき 'd /= d' がゼロによる除算の例外を投げないのはなぜですか?
2023-08-04 11:10:06
質問
ゼロによる除算の例外が発生しない理由がよくわかりません。
int d = 0;
d /= d;
ゼロによる除算の例外が発生すると思っていましたが、代わりに
d == 1
.
なぜ
d /= d
がゼロによる除算の例外を投げるのはなぜですか?
d == 0
?
どのように解決するのですか?
C++には、キャッチするための例外("Division by Zero")がありません。あなたが観察している動作は、コンパイラの最適化によってもたらされたものです。
- コンパイラーは未定義の動作が発生しないことを想定しています。
- C++でゼロによる除算は未定義の動作である
-
したがって、以下のようなコードは
が可能です。
がゼロによる除算を引き起こす可能性があるコードは、そうならないように推定されます。
- また、以下のようなコード は必ず を引き起こすコードは、ゼロによる除算が発生しないように仮定されます。
-
したがって、コンパイラは、Undefined Behavior が起こらないので、このコードの Undefined Behavior のための条件 (
d == 0
) は起こらないはずです。 -
したがって
d / d
は常に 1 に等しくなければなりません。
しかし...
あなたのコードに少し手を加えるだけで、コンパイラがゼロによる "real"除算を強制的にトリガーすることができます。
volatile int d = 0;
d /= d; //What happens?
さて、ここで疑問が残ります。基本的にコンパイラにこれを許可するよう強制した結果、何が起こるのでしょうか?これは未定義の動作ですが、私たちはコンパイラーがこの未定義の動作に対して最適化するのを阻止しました。
ほとんどの場合、それはターゲット環境に依存します。これはソフトウェア例外をトリガーしませんが、それは ができます。 (ターゲット CPU に依存) ハードウェア例外 (Integer-Divide-by-Zero) が発生する可能性があり、ソフトウェア例外が捕捉できる従来の方法では捕捉することができません。これは間違いなく x86 CPU のケースであり、他のほとんどのアーキテクチャ (すべてではありません!) でも同じです。
しかし、プログラムをクラッシュさせるのではなく、ハードウェア例外に対処する方法があります (発生した場合)。 例外のキャッチ: ゼロによる除算 . これらはコンパイラによって異なることに注意してください。
関連
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] Rubyの除算はなぜ10進数ではなく整数を返すのですか?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] C++ 警告: ゼロによるダブルの除算
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 整数オーバーフローが未定義の動作になるのはループのどの時点か?