10

次のコードについて質問があります。

int main { 
double x = 0;
double y = 0/x;

if(y==1) {.....}
....
....
return 0;
}

コンピューターでコードを実行すると、ランタイム エラーが発生せず、y = -nan(0x8000000000000). ゼロで除算しても実行時エラーにならないのはなぜですか?

さらに、最初の行をint x = 0; now に変更すると、ランタイム エラーが発生します。違いはなんですか?

4

3 に答える 3

14

この「動作」(つまり、常に同じことを移植可能に行う) にまったく依存することはできません。2 番目のケースでは C で未定義の動作であり、実装が定義されていない場合は最初の動作でもあります__STDC_IEC_559__(これは、最近は珍しいと思います)。

C99、§6.5.5/5

/ 演算子の結果は、最初のオペランドを 2 番目のオペランドで割った商です。% 演算子の結果は剰余です。どちらの操作でも、2 番目のオペランドの値がゼロの場合、動作は未定義です。

あるケースでは「Not a Number」を取得し、他のケースでは取得していないという事実は、1 つが浮動小数点演算で行われるということです。ここで、実装では (IEEE 754 除算ゼロ セマンティクスに準拠) 0/0、 NaN。

2 番目のケースでは、整数演算を使用しています。未定義の動作であり、何が起こるか予測できません。

于 2012-10-28T16:48:34.793 に答える
10

例外またはエラーが発生しない理由は、double の場合、無限大および NaN が定義されているためです ( IEEE 浮動小数点を参照)。定義済み

于 2012-10-28T16:46:55.653 に答える
4

これは、IEEE 754標準が、浮動小数点値の「非数」とともに、正および負の無限大の特別な値を定義しているためです。

のような非浮動小数点型にintは、これらの特別な値が定義されていないため、未処理のエラーが原因でランタイムが終了しています。

これは C 固有のものではありません。この機能はハードウェアに依存しているため、他の言語でも非常によく似た (同じではないにしても) 動作が見られます。

于 2012-10-28T16:49:17.290 に答える